当前位置:网站首页>Leetcode T40: 组合总和II
Leetcode T40: 组合总和II
2022-07-01 08:08:00 【范谦之】
题目描述
给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用 一次 。
注意:解集不能包含重复的组合。
示例 1:
输入: candidates = [10,1,2,7,6,1,5], target = 8,
输出:
[
[1,1,6],
[1,2,5],
[1,7],
[2,6]
]
示例 2:
输入: candidates = [2,5,2,1,2], target = 5,
输出:
[
[1,2,2],
[5]
]
提示
1 <= candidates.length <= 100
1 <= candidates[i] <= 50
1 <= target <= 30
思路
和上一题:组合总和I一样,都是使用dfs,但是,如果仍采用上一题的思路,尽管进行了剪枝,仍会超时。这里采用另一种dfs思路。
由于每个candidate[i]的范围都在[0, 50],所以可以定义一个数组记录每个元素的个数,然后根据这个数组进行dfs搜索。
代码
List<List<Integer>> res = new ArrayList<List<Integer>>();
HashMap<List<Integer>, Integer> map = new HashMap<List<Integer>, Integer>();
int tar;
int[] nums = new int[51];
// 当前选取的组合,选到了第几个数字,当前和, 剩下和
void dfs(List<Integer> lis, int cur, int s, int ts) {
if(cur == 51) {
if(s == tar && map.getOrDefault(lis, -1)==-1) {
map.put(lis, 1);
}
} else {
// for(int x: lis) System.out.print(x+","); System.out.println("\t"+cur+","+s);
if(nums[cur] == 0) dfs(lis, cur+1, s, ts);
else {
//对于当前数字
//选,看是否超过,剪枝
List<Integer> tmp = new ArrayList<Integer>(lis);
for(int i = 1; i <= nums[cur]; i++) {
if(s + i*cur <= tar) {
tmp.add(cur);
dfs(tmp, cur+1, s + i*cur, ts-i*cur);
}
}
// 不选,如果剩下的都装仍不能满足,则剪枝
if(s+ts-cur >= tar) {
List<Integer> tmp2 = new ArrayList<Integer>(lis);
dfs(tmp2, cur+1, s, ts-cur);
}
}
}
}
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
tar = target;
for(int x: candidates) nums[x]++;
int s = 0;
for(int x: candidates) s += x;
dfs(new ArrayList<Integer>(), 0, 0, s);
for(List<Integer> lis: map.keySet()) {
res.add(lis);
}
return res;
}
边栏推荐
- Source code analysis of open source API gateway APIs IX
- Sqlalchemy creating MySQL_ Table
- QT -- 1. QT connection database
- Android screen adaptation (using constraintlayout), kotlin array sorting
- 【入门】截取字符串
- [untitled]
- 使用threejs简单Web3D效果
- Koltin35, headline Android interview algorithm
- Array: question brushing record
- Scala language learning-07-constructor
猜你喜欢
PostgreSQL source code learning (26) -- windows vscode remote debugging PostgreSQL on Linux
Soft keyboard height error
Principle and process of embossing
凸印的印刷原理及工艺介绍
QT -- 1. QT connection database
window c盘满了
【网站架构】一招搞定90%的分布式事务,实打实介绍数据库事务、分布式事务的工作原理应用场景
How to use layui to display the data in the database in the form of tables
0 basic introduction to single chip microcomputer: how to use digital multimeter and precautions
[untitled]
随机推荐
Significance and measures of source code encryption
力扣每日一题-第31天-1502.判断能否形成等差数列
Contenttype comparison of all types
empirical study and case study
When using charts to display data, the time field in the database is repeated. How to display the value at this time?
事务方法调用@Transactional
【批处理DOS-CMD命令-汇总和小结】-Cmd窗口中常用操作符(<、<<、&<、>、>>、&>、&、&&、||、|、()、;、@)
How to troubleshoot SharePoint online map network drive failure?
On June 30, 2022, the record of provincial competition + national competition of Bluebridge
[batch dos-cmd command - summary and summary] - Common operators in the CMD window (<, < <, & <,>, > >, & >, & >, & &, ||, (),;, @)
LM08丨网格系列之网格反转(精)
Li Kou daily question - Day 32 -1822 Symbol of array element product
Airsim雷达相机融合生成彩色点云
AArdio - 【问题】bass库回调时内存增长的问题
Office365 - how to use stream app to watch offline files at any time
Uni hot update
数字转excel的字符串坐标
Programmer's regimen
0 basic introduction to single chip microcomputer: how to use digital multimeter and precautions
使用beef劫持用户浏览器