链接:
题目:
给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。
注意:
答案中不可以包含重复的四元组。
示例:
给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。
满足要求的四元组集合为:
[
[-1, 0, 0, 1],
[-2, -1, 1, 2],
[-2, 0, 0, 2]
]
我的解法1: 超时了,在3sum的基础上,增加第二个数的循环
class Solution:
def fourSum(self, nums, target):
sol = []
nums.sort()
for i in range(len(nums)-3):
if (target <=0 and nums[i] <= 0) or target > 0:
if i>0 and nums[i] == nums[i-1]:
continue
for l in range(i+1, len(nums)-2):
if l-1 != i and nums[l] == nums[l-1]:
continue
j = l + 1
k = len(nums) - 1
while j<k:
if j-1 != l and nums[j] == nums[j-1]:
j += 1
continue
if nums[i]+ nums[l] + nums[j]+nums[k] == target: sol.append([nums[i],nums[l],nums[j],nums[k]])
j += 1
k -= 1
elif nums[i]+ nums[l] + nums[j]+nums[k] < target:
j += 1
elif nums[i]+ nums[l] + nums[j]+nums[k] > target:
k -= 1
return sol
我的解法2: 优化了下,80ms,超越94%
class Solution:
def fourSum(self, nums, target):
sol = []
nums.sort()
for i in range(len(nums)-3):
# target在当前nums[i]能到达的最大最小范围内,筛掉了一波i
if target >= (nums[i]+nums[i+1]+nums[i+2]+nums[i+3]) and target<=(nums[i]+nums[len(nums)-3]+nums[len(nums)-2]+nums[len(nums)-1]):
# 去重,i从1开始;如果两个相连的数相等的话,第二个的结果被包含
if i>0 and nums[i] == nums[i-1]:
continue
for l in range(i+1, len(nums)-2):
# target在当前i,当前j对应的nums范围内,筛选一波j
if (nums[i]+ nums[l] + nums[l+1]+nums[l+2]) <= target and (nums[i]+ nums[l] + nums[len(nums)-2]+nums[len(nums)-1]) >= target:
# 去重
if l-1 != i and nums[l] == nums[l-1]:
continue
# j从前,k从后,
j = l + 1
k = len(nums) - 1
while j<k:
# 去重
if j-1 != l and nums[j] == nums[j-1]:
j += 1
continue
temp = nums[i]+ nums[l] + nums[j]+nums[k]
if temp == target:
sol.append([nums[i],nums[l],nums[j],nums[k]])
j += 1
k -= 1
elif temp < target:
j += 1
elif temp > target:
k -= 1
return sol
别人的解法:
class Solution(object):
def fourSum(self, nums, target):
def nSum(nums, target, n, result, results):
length = len(nums)
if(len(nums)<n or n<2 or n*nums[0]>target or n*nums[length-1]<target):
return []
if n==2:
begin, end = 0, length-1
while begin<end:
sums = nums[begin]+nums[end]
if(sums<target):
begin += 1
elif(sums>target):
end -= 1
else:
temp = [nums[begin], nums[end]]
results.append(result + temp)
while begin<end and nums[begin]==temp[0]:
begin += 1
while begin<end and nums[end]==temp[1]:
end -= 1
else:
for i in range(length - n + 1):
if(i>0 and nums[i]==nums[i-1]):
continue
if n*nums[i]>target:
break
nSum(nums[i+1 : ], target-nums[i], n-1, result+[nums[i]], results)
results = []
nums.sort()
nSum(nums, target, 4, [], results)
return results