当前位置:网站首页>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;
}
边栏推荐
- postgresql源码学习(26)—— Windows vscode远程调试Linux上的postgresql
- window c盘满了
- PostgreSQL source code learning (26) -- windows vscode remote debugging PostgreSQL on Linux
- 【网站架构】一招搞定90%的分布式事务,实打实介绍数据库事务、分布式事务的工作原理应用场景
- [untitled]
- OJ input and output exercise
- IMDB practice of emotion classification (simplernn, LSTM, Gru)
- Cmake I two ways to compile source files
- Significance and measures of source code encryption
- When using charts to display data, the time field in the database is repeated. How to display the value at this time?
猜你喜欢
![[untitled]](/img/d9/5e97f2de256b9749131b5bf1437d24.png)
[untitled]

Differential: definition of total differential, partial derivative, gradient

Gdip - hatchbrush pattern table

Airsim radar camera fusion to generate color point cloud

Learn the knowledge you need to know about the communication protocol I2C bus

OJ输入输出练习

How to use layui to display the data in the database in the form of tables

Utiliser Beef pour détourner le navigateur utilisateur
![[batch dos-cmd command - summary and summary] - Common operators in the CMD window (<, < <, & <,>, > >, & >, & >, & &, ||, (),;, @)](/img/48/de19e8cc007b93a027a906d4d423b2.png)
[batch dos-cmd command - summary and summary] - Common operators in the CMD window (<, < <, & <,>, > >, & >, & >, & &, ||, (),;, @)

Instead of houses, another kind of capital in China is rising
随机推荐
Aardio - [problem] the problem of memory growth during the callback of bass Library
数字转excel的字符串坐标
Embedded-c language-10-enumeration / (function) pointer (function) / multi-level pointer /malloc dynamic allocation / file operation
How outlook puts together messages with the same discussion
Provincial election + noi Part VI skills and ideas
Aardio - 自己构造的getIconHandle的方法
Aardio - 阴影渐变文字
web254
【入门】取近似值
使用beef劫持用戶瀏覽器
力扣每日一题-第31天-1502.判断能否形成等差数列
[force deduction 10 days SQL introduction] Day9 control flow
AArdio - 【问题】bass库回调时内存增长的问题
Koltin35, headline Android interview algorithm
力扣每日一题-第32天-1822.数组元素积的符号
SharePoint - how to quickly check whether SharePoint is standard or enterprise edition?
String coordinates of number to excel
0 basic introduction to single chip microcomputer: how to use digital multimeter and precautions
php laravel微信支付
EDA开源仿真工具verilator入门6:调试实例