跟着专注于计算机视觉的AndyJ的妈妈我学算法之每日一题不是leetcode题N数之和

来,做完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)

好了,就到这里了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值