Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

4Sum II ใน Python

สมมติว่าเรามีสี่รายการ A, B, C, D ของค่าจำนวนเต็ม เราต้องคำนวณว่ามีทูเพิล (i, j, k, l) กี่ชุดที่ทำให้ A[i] + B[j] + C[k] + D[l] เท่ากับศูนย์ พิจารณาว่า A, B, C, D ทั้งหมดมีความยาวเท่ากันคือ N โดยที่ 0 ≤ N ≤ 500 จำไว้ว่าจำนวนเต็มทั้งหมดอยู่ในช่วง -228 ถึง 228 - 1 และผลลัพธ์รับประกันว่าจะไม่เกิน 231 - 1 ดังนั้นถ้าอินพุตคือ A = [1, 2], B = [-2, -1], C = [-1, 2], D = [0, 2] ผลลัพธ์จะเป็น 2 เพราะมีทูเพิลสองชุด คือ (0, 0, 0, 1) ทำให้ A[0] + B[0] + C[0] + D[1] = 1 + (-2) + (-1) + 2 = 0 และอีกชุดคือ (1, 1, 0, 0) ทำให้ A[1] + B[1] + C[0] + D[0] = 2 + (-1) + (-1) + 0 = 0

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนต่อไปนี้ −

  • สร้างแมปชื่อ sums
  • สำหรับแต่ละองค์ประกอบ i ใน A
    • สำหรับแต่ละองค์ประกอบ j ใน B
      • ถ้า i + j ไม่อยู่ในแมป sums ให้ตั้ง sums[i + j] := 1
      • มิฉะนั้นเพิ่มค่าของ sums[i + j]
  • counter := 0
  • สำหรับแต่ละองค์ประกอบ i ใน C
    • สำหรับแต่ละองค์ประกอบ j ใน D
      • ถ้า (-1)*(i + j) อยู่ใน sums ให้ counter := counter + sums[-1 * (i + j)]
  • คืนค่า counter

ตัวอย่าง

มาดูการนำไปใช้เพื่อความเข้าใจที่ดีขึ้น −

class Solution(object):
    def fourSumCount(self, A, B, C, D):
        sums = {}
        for i in A:
            for j in B:
                if i + j not in sums:
                    sums[i + j] = 1
                else:
                    sums[i + j] += 1
        counter = 0
        for i in C:
            for j in D:
                if -1 * (i + j) in sums:
                    # print(-1 * (i + j))
                    counter += sums[-1 * (i + j)]
        return counter

ob1 = Solution()
print(ob1.fourSumCount([1, 2], [-2, -1], [-1, 2], [0, 2]))

อินพุต

[1,2] [-2,-1] [-1,2] [0,2]

ผลลัพธ์

2