LeetCode 454 python 优化历程
作者:互联网
尝试解题1
使用两个列表分表保存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,这样下来就会超时
尝试解题2
使用遍历+二分查找,题目中每个数组都可能会出现重复元素,因此需要用一个哈希表记录元素出现的次数
使用一个哈希表记录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)超时
尝试解题3
使用哈希表记录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)
标签:python,List,454,nums1,int,nums4,LeetCode,nums2,nums3 来源: https://blog.csdn.net/qq_42316533/article/details/122455230