4数之和题目描述:
给定一个包含 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]
]
结合之前3数之和的思想,多加了一个用于循环求4数之和,结果超出了时间限制。别人的方法写了两个函数,其中一个需要递归,可以直接计算Ñ数之和,简直不要太厉害,也解决了我的疑问如果5个数6个数7个数的时候总不能还是这个思路吧.....下面给出自己的病态代码,以及别人家的代码!!!
我
class Solution:
def fourSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[List[int]]
"""
nums.sort()
length = len(nums)
num = []
if length<4:
return num
elif length == 4:
if nums[0]+nums[1]+nums[2]+nums[3] == target:
num.append([nums[0], nums[1], nums[2], nums[3]])
return num
else:
return num
for i in range(0 , length - 3):
tag = target - nums[i]
for j in range(i + 1 , length - 2):
l = j + 1
r = length -1
while l<r:
sum = nums[j] + nums[l] + nums[r]
if sum > tag:
r = r - 1
elif sum < tag:
l = l + 1
else:
if [nums[i],nums[j],nums[l],nums[r]] not in num:
num.append([nums[i],nums[j],nums[l],nums[r]])
l = l + 1
r = r - 1
return num
Ñ个数之和:(findNsum函数里的参数确定多少个数之和)
class Solution: def fourSum(self, nums, target): def findNsum(nums, target, N, cur): if len(nums) < N or N < 2 or nums[0] * N > target: return if N == 2: l , r = 0 , len(nums) - 1 while l < r: s = nums[l] + nums[r] if s == target: res.append(cur + [nums[l] , nums[r]]) while l < r and nums[l] == nums[l + 1]: l += 1 while l < r and nums[r] == nums[r - 1]: r -= 1 l += 1 r -= 1 elif s < target: l += 1 else: r -= 1 else: for i in range(len(nums) - N + 1): if i == 0 or nums[i - 1] != nums[i]: findNsum(nums[i + 1 :],target - nums[i], N - 1, cur + [nums[i]]) res = [] findNsum(sorted(nums),target,4,[]) return res