《Leetcode of September 》回溯算法之:216. 组合总和 III

 

class Solution:
    def combinationSum3(self, k: int, n: int) -> List[List[int]]:
        def huisu(index,end,nums,temp,path):
            #剪枝
            if path>n:
                return
            #和等于n而且个数还要是k 
            if path==n and len(temp)==k:
                res.append(temp[:])
                return
            
            for i in range(index,end):
                #剪枝
                if nums[i]>n:
                    break
                if visited[i]:
                    continue
                #保证了不出现[1,2,3]和[3,2,1]这种情况
                if len(temp)>0 and temp[-1]>nums[i]:
                    continue
                
                temp.append(nums[i])
                path+=nums[i]
                visited[i]==True
                huisu(i+1,end,nums,temp,path)
                path-=nums[i]
                visited[i]=False
                temp.pop()
        res = []
        nums = [ i for i in range(1,10)]
        #标记数组,保证重复的数不出现
        visited = [False for _ in range(10)]
        huisu(0,9,nums,[],0)
        return res

总结:题目比较简单,就是基本的回溯模板,然后剪枝,不能重复,且数组的长度有要求,筛选一遍就可以了。不能出现重复的元素就需要标记数组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值