python算法之组合总和
给定一个无重复元素的数组 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算法之组合总和相关推荐
- leetcode算法题--组合总和
原题链接:https://leetcode-cn.com/problems/combination-sum/ 1.回溯 class Solution {public:vector<vector& ...
- 【Leetcode刷题Python】40. 组合总和 II
1 题目 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每 ...
- 面试腾讯算法:组合总和
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无限制重复被选 ...
- leetcode算法题--组合总和 Ⅳ★
原题链接:https://leetcode-cn.com/problems/combination-sum-iv/ 1.递归 一开始用递归做,写完就就对了,不过超时了,其实我没有很懂为何递归不会出现重 ...
- 算法训练Day25 | LeetCode216. 组合总和III(和77.组合很像!);LeetCode17. 电话号码的字母组合(不同集合中组合)
目录 LeetCode216. 组合总和III 1. 思路 2. 代码实现 3. 剪枝 4. 复杂度分析 5. 思考与收获 LeetCode17. 电话号码的字母组合 1. 思路 2. 代码实现 3. ...
- python可以做力扣的题吗_Python之中力扣之组合总和
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合.candidates 中的每个数字在每个组合中只能使用一次. ...
- 求n个数中第k大的数_互联网高频面试题目:「回溯算法」求组合总和
我将算法学习相关的资料已经整理到了Github :https://github.com/youngyangyang04/leetcode-master,里面还有leetcode刷题攻略.各个类型经典题 ...
- 本题要求实现一个求整数的逆序数的简单函数。_回溯算法:求组合总和(二)...
给「代码随想录」一个星标吧! ❝ 我将公众号文章和学习相关的资料整理到了Github :https://github.com/youngyangyang04/leetcode-master,方便大家在 ...
- 算法训练Day44 动态规划专题- 背包问题 | 完全背包基础知识;LeetCode518. 零钱兑换(装满背包有多少种方法,组合数);377.组合总和IV(装满背包有多少种方法,排列数)
前言: 算法训练系列是做<代码随想录>一刷,个人的学习笔记和详细的解题思路,总共会有60篇博客来记录,计划用60天的时间刷完. 内容包括了面试常见的10类题目,分别是:数组,链表,哈希表 ...
最新文章
- python序列化和反序列化
- python语言if语句-Python中if语句是怎么用的?本文详解
- python教授_Python为何如此优秀?斯坦福教授告诉你!
- dotnet 从零开始写一个人工智能 网络模型
- idea中代码能够运行,但是显示类找不到
- log4j的使用 20220228
- ES6语法---set
- 自制计算机语言,3个步骤实现简单语言解释器(自制简易编程语言)
- 【简报】帮助开发人员在线了解CSS Filter特性的工具 - CSS FilterLab
- 显示器 设置选项 解析
- Request模块实战04 ---- 爬取豆瓣电影排行榜
- JS:关系运算符(>大于、>=大于等于、<小于、<=小于等于)
- 安卓源码AOSP下载使用的正确姿势
- 分别实现:css动画、js动画、vue动画
- sudo apt-get install build-essential的作用
- error: AC_CONFIG_MACRO_DIRS([m4]) conflicts with ACLOCAL_AMFLAGS=-I m4 解决方法
- Mac打不开后缀名为txt文件,显示文本编码中文不适用的解决措施
- python3 zip破解
- 【医学影像】超声(UltraSound)影像的增强与目标检测
- ieee 802.3学习笔记-PHY