20n数之和
Posted 炫云云
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20n数之和相关的知识,希望对你有一定的参考价值。
n数之和
对于三数之和,可以依次固定第一个数,然后解决两数之和的问题。那么,对于n数之和,也可以采用同样的思路,依次固定数据,不断缩小问题的规模,最基本的情况还是两数之和问题,所以可以采用递归算法解决n数之和问题。
-
如果
n==2
,两数之和问题,正常求解; -
如果
n>2
,则遍历固定第一个数,解决更小规模的n-1
数之和的问题; -
注意跳过数据重复的情况即可;
class Solution:
def NSum(nums, n, target):
nums.sort()
return self.nSum(nums, n, target)
def nSum(self, nums, n, target):
"""注意,此函数的nums应是排序后的数组,否则每层递归都要对nums排序,效率极低"""
if len(nums) < n:
return []
res = []
# twoSum
if n == 2:
left, right = 0, len(nums)-1
while left < right:
if nums[left] + nums[right] == target:
res.append([nums[left], nums[right]])
left += 1
right -= 1
#需要和上一次枚举的数不相同
while left < right and nums[left] == nums[left-1]:
left += 1
while left < right and nums[right] == nums[right+1]:
right -= 1
elif nums[left] + nums[right] > target:
right -= 1
else:
left += 1
return res
else:
for first_idx in range(len(nums)):#一种情况
if first_idx > 0 and nums[first_idx] == nums[first_idx-1]:
continue
subres = self.nSum(nums[first_idx+1:], n-1, target-nums[first_idx])
for i in range(len(subres)): # first_idx 的i种子情况
res.append([nums[first_idx]]+subres[i])
return res
参考
以上是关于20n数之和的主要内容,如果未能解决你的问题,请参考以下文章
代码随想录算法训练营第7天 | ● 454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ● 18. 四数之和 ● 总结