来,做完2数之和,3数之和,再来个N数之和。这个题和2,3数之和一样,不说了。
纯手工代码,自己做了些验证,感觉没问题,欢迎读者测试,审核。
N数之和,除了n==2时用2数之和,其他情况用递归。
所以递归的思想只要有,就好。
和三数之和代码几乎一模一样。
2的时候,调用2数之和,其他情况,递归。
递归:就是解决,当前这一步要做好什么事。就这样。
code:
class Solution:
def nsum(self, nums, target, n):
nums = sorted(nums)
if n == 2:
tsum_res = self.twosum(nums, target)
return tsum_res
else:
ret = []
for i in range(len(nums)-n):
if i!=0 and nums[i]==nums[i-1]:
continue
nsum_res = self.nsum(nums[i+1:], target-nums[i], n-1)
if not nsum_res:
continue
for re in nsum_res:
ret.append([nums[i]]+re)
return ret
def twosum(self, nums, target):
n = len(nums)
l = 0
r = n - 1
res = []
while l<r:
cal = nums[l] + nums[r]
if cal == target:
res.append([nums[l], nums[r]])
while l+1 < n and nums[l] == nums[l+1]:
l += 1
while r-1 >=0 and nums[r] == nums[r-1]:
r -= 1
l += 1
r -= 1
elif cal < target:
while l+1 < n and nums[l] == nums[l+1]:
l += 1
l += 1
elif cal > target:
while r-1 >=0 and nums[r] == nums[r-1]:
r -= 1
r -= 1
return res
a = Solution()
res = a.nsum([1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5], 6, 4)
print(res)
好了,就到这里了。