20n数之和

Posted 炫云云

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20n数之和相关的知识,希望对你有一定的参考价值。

n数之和

1.两数之和

15. 三数之和

18. 四数之和

20、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

参考

Krahets - 力扣(LeetCode) (leetcode-cn.com)

以上是关于20n数之和的主要内容,如果未能解决你的问题,请参考以下文章

1049. 数列的片段和(20)

PAT 1049. 数列的片段和

代码随想录算法训练营第7天 | ● 454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ● 18. 四数之和 ● 总结

B1049 数列的片段和

代码随想录算法训练营第七天 | 454.四数相加II ,383. 赎金信 ,15. 三数之和,18. 四数之和

PAT-乙级-1049 数列的片段和