题目分析:
这道题目与3Sum类似,只是变成了4Sum,可以再3Sum外加一层循环解决,在网上看到了另一种解法,先两两相加存到字典里,再双循环让目标减去两个数看结果是否在字典里,时间复杂度由O(n3)变为O(n2),所以我提供两种解法。第一种方法使用了字典,用空间换取时间,消耗大概是160ms,第二种消耗大概是1000ms。
第一种:字典查询法
代码说明:
1、双循环生成字典
for i in range(l):
for j in range(i + 1, l):
sum = nums[i] + nums[j]
if sum not in dict:
dict.update({sum: [(i, j)]})
else:
dict[sum].append((i, j))
2、为了保证加入的顺序,p一定小于q,t[0]一定小于t[1],所以只需q小于t[0]即可保证p<q<t[0]<t[1],这样方便set去重
if q < t[0]:res.add((nums[p], nums[q], nums[t[0]], nums[t[1]]))
3、set转list
[list(i) for i in res]
测试代码:
class Solution:
def fourSum(self, nums, target):
nums.sort()
l, res, dict = len(nums), set(), {}
if l < 4:return []
for i in range(l):
for j in range(i + 1, l):
sum = nums[i] + nums[j]
if sum not in dict:
dict.update({sum: [(i, j)]})
else:
dict[sum].append((i, j))
for p in range(l):
for q in range(p + 1, l - 2):
goal = target - nums[p] - nums[q]
if goal in dict:
for t in dict[goal]:
if q < t[0]:res.add((nums[p], nums[q], nums[t[0]], nums[t[1]]))
return [list(i) for i in res]
print(Solution().fourSum([-1,0,1,2,-1,-4], -1)) #提交时请删除该行
第二种:多层循环加指针
代码说明:
这个没什么好说的多加一层循环,和一层用去去重的判断,如果不懂可以参考3Sum结题报告
for p in range(l):
if p > 0 and nums[p] == nums[p - 1]: continue
测试代码
class Solution:
def fourSum(self, nums, target):
if not nums: return nums
nums.sort()
l = len(nums)
res = []
for p in range(l):
if p > 0 and nums[p] == nums[p - 1]: continue
for i in range(p+1, l):
if i > p+1 and nums[i] == nums[i-1]: continue
goal = target - nums[p] - nums[i]
j, k = i + 1, l - 1
while(j < k):
if nums[j] + nums[k] == goal:
res.append([nums[p], nums[i], nums[j], nums[k]])
while j < k and nums[j] == nums[j + 1]: j += 1
while j < k and nums[k] == nums[k - 1]: k -= 1
j += 1
k -= 1
elif nums[j] + nums[k] < goal: j += 1
else: k -= 1
return res
print(Solution().fourSum([1,-2,-5,-4,-3,3,3,5], -11)) #提交时请删除该行