使用两个列表分表保存nums1与nums2的和、nums3与num4的和
遍历这两个列表找到相加为和的个数,即为最后结果
超时 21/132
class Solution: def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int: L_12 = [] L_34 = [] for num1 in nums1: for num2 in nums2: L_12.append(num1+num2) for num3 in nums3: for num4 in nums4: L_34.append(num3+num4) res = 0 for num1 in L_12: for num2 in L_34: if num1 + num2 == 0: res += 1 return res
时间复杂度为O((2*n)**2),空间复杂度为O(4n),n为200,这样下来就会超时
使用遍历+二分查找,题目中每个数组都可能会出现重复元素,因此需要用一个哈希表记录元素出现的次数
使用一个哈希表记录nums4的元素个数,遍历前三个数组,然后对nums4使用二分查找
超时: 33/132
class Solution: def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int: def fun(nums1, nums2, nums3, nums4, ans): nums4.sort() n1, n2, n3, n4 = len(nums1), len(nums2), len(nums3), len(nums4) d = {} for num in nums4: if num not in d: d[num] = 1 else: d[num] += 1 for i in range(n1): for j in range(n2): for k in range(n3): tmp = -(nums1[i]+nums2[j]+nums3[k]) l = 0 r = n4-1 while l <= r: mid = (l+r)//2 if nums4[mid] > tmp: r = mid-1 elif nums4[mid] < tmp: l = mid+1 else: ans += d[nums4[mid]] l = r+1 return ans res = fun(nums1, nums2, nums3, nums4, 0) return res
时间复杂度为:O(n**3logn),空间复杂度为O(n)超时
使用哈希表记录nums1和nums2的和的负数的个数,然后遍历nums3和nums4,直接索引它们的和。
终于通过啦!
class Solution: def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int: d = {} for num1 in nums1: for num2 in nums2: if -(num1+num2) not in d: d[-(num1+num2)] = 1 else: d[-(num1+num2)] += 1 res = 0 for num1 in nums3: for num2 in nums4: if num1+num2 in d: res += d[num1+num2] return res
时间复杂度为O(n**2), 空间复杂度为O(2n)