组合总和- python-回溯哦&剪枝

题目:

思路:

K神的思路清晰明了,推荐阅读:

https://leetcode.cn/problems/combination-sum/solutions/2363929/39-zu-he-zong-he-hui-su-qing-xi-tu-jie-b-9zx7/?envType=study-plan-v2&envId=top-100-likedhttps://leetcode.cn/problems/combination-sum/solutions/2363929/39-zu-he-zong-he-hui-su-qing-xi-tu-jie-b-9zx7/?envType=study-plan-v2&envId=top-100-liked跟全排列的做法差不多,但是需要两次剪枝:一是和不能超过目标值;二是去重[3,4]和[4,3]是一样的

代码:

复制代码
class Solution:
    def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
        def backtrack(
            state: list[int], target: int, choices: list[int], start: int, res: list[list[int]]
        ):
            if target == 0:
                res.append(list(state))
                return
            for i in range(start,len(choices)):#从start开始,能去重
                if target - choices[i] < 0:#结果不能大于target
                    break
                state.append(choices[i])
                backtrack(state,target-choices[i],choices,i,res)#因为可以重复选,所以这里的start是i而不是i+1
                state.pop()
        
        state = []
        candidates.sort()#在遍历所有选择时,当子集和超过 target 时直接结束循环,因为后边的元素更大,其子集和都一定会超过 target 。
        start = 0
        res = []
        backtrack(state,target,candidates,start,res)
        return res
相关推荐
2501_945423541 分钟前
C++编译期多态实现
开发语言·c++·算法
2401_879693871 分钟前
设计模式在C++中的实现
开发语言·c++·算法
ZWZhangYu4 分钟前
【Gradio系列】使用 Gradio 快速构建机器学习图像分类实战
人工智能·机器学习·分类
☆5665 分钟前
C++中的代理模式高级应用
开发语言·c++·算法
2301_818419016 分钟前
编译器命令选项优化
开发语言·c++·算法
m0_518019486 分钟前
C++图形编程(OpenGL)
开发语言·c++·算法
Jasmine_llq7 分钟前
《B4354 [GESP202506 一级] 假期阅读》
数据结构·算法·最值筛选算法(核心逻辑)·三元运算符简化分支算法·多输入顺序处理算法·整数算术运算算法·格式化输出算法
霖大侠7 分钟前
Towards Generalizable Scene Change Detection
人工智能·深度学习·机器学习
2301_8166512210 分钟前
自定义异常类设计
开发语言·c++·算法
weixin_4219226911 分钟前
C++与自动驾驶系统
开发语言·c++·算法