leetcode:216. Combination Sum III

216. Combination Sum III

大意是说在1-9中选k个不同的数,使他们的和是n,返回是所有的选择。

Example 1:
输入: k = 3, n = 7
输出:[[1,2,4]]

Example 2:
输入: k = 3, n = 9
输出:[[1,2,6], [1,3,5], [2,3,4]]

思路:
1. 输入的k 肯定在必须在 1-9之间
2. 假定输出的最后一个数是m,从m=9不断进行尝试,输入的n 必须在 k*(k+1)/2 k(2*m-k)/2 之间
3. 采用递归的方式
4. 如果只剩下一个数,把它放在首位就行了
5. 注意:python的浅复制与深复制

class Solution(object):
    def combinationSum3(self, k, n):
        """
        :type k: int
        :type n: int
        :rtype: List[List[int]]
        """
        if k<0 or k>9:return []
        ans=[]
        tem=[0]*k
        self.com(ans,tem,k,n,9)
        return ans
    def com(self,ans,tem,k,n,m):
        if k<0 or k>m :return
        if n<k*(k+1)/2 or n>k*(2*m+1-k)/2: return#初次尝试
        tep=tem[:]#浅复制
        if k==1:#只有(只剩下)一个数,这个时候把n放在首位就好了
            tep[0]=n
            ans.append(tep[:])#再次浅复制!
        for i in range(m,k-1,-1):
            #又一次尝试,i是要放入数组中最大的数,取值【k,m】
            tep[k-1]=i
            self.com(ans,tep,k-1,n-i,i-1)#下一次的最大尝试是i-1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值