给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的数字可以无限制重复被选取。

说明:

所有数字(包括 target)都是正整数。
解集不能包含重复的组合。 
示例 1:

输入: candidates = [2,3,6,7], target = 7,
所求解集为:
[[7],[2,2,3]]
示例 2:

输入: candidates = [2,3,5], target = 8,
所求解集为:
[ [2,2,2,2],[2,3,3],[3,5]]

class Solution:
    def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
        self.res = []
        if len(candidates) <= 0:
            return res
        candidates.sort()
        self.dfs(candidates,[],target,0)  # 递归回溯
        return self.res
            
    def dfs(self,candidates,sublist,target,last):  # last表示当前sublist的最后一个元素
        if target == 0:
            self.res.append(sublist) 
        if target < candidates[0]:  # 剪枝操作,目标值小于拥有的最小元素
            return 
        for num in candidates:  # 数字可重复使用,则每次从头遍历
            if num > target:  # 剪枝操作,当当前数值大于目标值,则后续无需遍历
                return 
            if num < last: # 剪枝操作:若当前数值小于当前sublist的最后一个元素,则继续遍历,防止出现重复解决方案,如[2,2,3],[3,2,2]
                continue
            self.dfs(candidates,sublist+[num],target-num,num)

def t2(li,v):
    li= sorted(li)
    ans=[]
    def f(s,use,remain):  #s是li的坐标
        for i in range(s,len(li)):
            c=li[i]
            if c==remain:
                ans.append(use+[c])
            if c<remain:
                f(i,use+[c],remain-c)
            if c>remain:
                return
    f(0,[],v)
    return ans

if __name__ == '__main__':
    li=[2,3,4,5,6,7]
    r3=t2(li,10)
    print(r3)

递归函数 dfs(candidates,sublist,target,last),其中sublist记录当前满足条件的子数组,last为当前子数组的最后一个元素。

剪枝操作1:目标值小于元素数组的最小元素,则无需继续遍历

剪枝操作2:当前元素大于目标值,则后续元素一定大于目标值(数组已排序),不会满足条件,无需继续遍历

剪枝操作3:若当前数值小于当前sublist的最后一个元素,则继续遍历,防止出现重复解决方案,如[2,2,3],[3,2,2]

python算法之组合总和相关推荐

  1. leetcode算法题--组合总和

    原题链接:https://leetcode-cn.com/problems/combination-sum/ 1.回溯 class Solution {public:vector<vector& ...

  2. 【Leetcode刷题Python】40. 组合总和 II

    1 题目 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每 ...

  3. 面试腾讯算法:组合总和

    给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无限制重复被选 ...

  4. leetcode算法题--组合总和 Ⅳ★

    原题链接:https://leetcode-cn.com/problems/combination-sum-iv/ 1.递归 一开始用递归做,写完就就对了,不过超时了,其实我没有很懂为何递归不会出现重 ...

  5. 算法训练Day25 | LeetCode216. 组合总和III(和77.组合很像!);LeetCode17. 电话号码的字母组合(不同集合中组合)

    目录 LeetCode216. 组合总和III 1. 思路 2. 代码实现 3. 剪枝 4. 复杂度分析 5. 思考与收获 LeetCode17. 电话号码的字母组合 1. 思路 2. 代码实现 3. ...

  6. python可以做力扣的题吗_Python之中力扣之组合总和

    给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合.candidates 中的每个数字在每个组合中只能使用一次. ...

  7. 求n个数中第k大的数_互联网高频面试题目:「回溯算法」求组合总和

    我将算法学习相关的资料已经整理到了Github :https://github.com/youngyangyang04/leetcode-master,里面还有leetcode刷题攻略.各个类型经典题 ...

  8. 本题要求实现一个求整数的逆序数的简单函数。_回溯算法:求组合总和(二)...

    给「代码随想录」一个星标吧! ❝ 我将公众号文章和学习相关的资料整理到了Github :https://github.com/youngyangyang04/leetcode-master,方便大家在 ...

  9. 算法训练Day44 动态规划专题- 背包问题 | 完全背包基础知识;LeetCode518. 零钱兑换(装满背包有多少种方法,组合数);377.组合总和IV(装满背包有多少种方法,排列数)

    前言: 算法训练系列是做<代码随想录>一刷,个人的学习笔记和详细的解题思路,总共会有60篇博客来记录,计划用60天的时间刷完.  内容包括了面试常见的10类题目,分别是:数组,链表,哈希表 ...

最新文章

  1. python序列化和反序列化
  2. python语言if语句-Python中if语句是怎么用的?本文详解
  3. python教授_Python为何如此优秀?斯坦福教授告诉你!
  4. dotnet 从零开始写一个人工智能 网络模型
  5. idea中代码能够运行,但是显示类找不到
  6. log4j的使用 20220228
  7. ES6语法---set
  8. 自制计算机语言,3个步骤实现简单语言解释器(自制简易编程语言)
  9. 【简报】帮助开发人员在线了解CSS Filter特性的工具 - CSS FilterLab
  10. 显示器 设置选项 解析
  11. Request模块实战04 ---- 爬取豆瓣电影排行榜
  12. JS:关系运算符(>大于、>=大于等于、<小于、<=小于等于)
  13. 安卓源码AOSP下载使用的正确姿势
  14. 分别实现:css动画、js动画、vue动画
  15. sudo apt-get install build-essential的作用
  16. error: AC_CONFIG_MACRO_DIRS([m4]) conflicts with ACLOCAL_AMFLAGS=-I m4 解决方法
  17. Mac打不开后缀名为txt文件,显示文本编码中文不适用的解决措施
  18. python3 zip破解
  19. 【医学影像】超声(UltraSound)影像的增强与目标检测
  20. ieee 802.3学习笔记-PHY

热门文章

  1. 构成网页各个主要标签的作用
  2. 【设计模式修炼】第一章 :获得《七大原则》
  3. 【记录】微信网页授权错误码10003:redirect_uri域名与后台配置不一致
  4. Centos7查看防火墙以及端口开放情况
  5. 解决微信小程序实时视频、直播插件 主播意外掉线再进入,观众端卡住断流,无法刷新的问题
  6. 【算法】最短路径--Hdu2066 一个人的旅行
  7. FCM聚类算法详解(Python实现iris数据集)
  8. rockchip 平台ksz8863rll调试
  9. 微信小程序 在for循环中调用wx.request异步请求数据
  10. C++语言—深入理解构造函数