Skip to content

Commit 5cd6225

Browse files
committed
三刷40
1 parent 8653e79 commit 5cd6225

File tree

4 files changed

+64
-9
lines changed

4 files changed

+64
-9
lines changed

docs/0040-combination-sum-ii.adoc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,15 @@ include::{sourcedir}/_0040_CombinationSumII.java[tag=answer]
7171
include::{sourcedir}/_0040_CombinationSumII_2.java[tag=answer]
7272
----
7373
--
74+
75+
三刷::
76+
+
77+
--
78+
[{java_src_attr}]
79+
----
80+
include::{sourcedir}/_0040_CombinationSumII_3.java[tag=answer]
81+
----
82+
--
7483
====
7584

7685
== 参考资料

logbook/202406.adoc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -635,6 +635,11 @@
635635
|{doc_base_url}/0102-binary-tree-level-order-traversal.adoc[题解]
636636
|✅广度优先遍历
637637

638+
|{counter:codes}
639+
|{leetcode_base_url}/combination-sum-ii/[40. Combination Sum II^]
640+
|{doc_base_url}/0040-combination-sum-ii.adoc[题解]
641+
|✔️组合,回溯,剪枝
642+
638643
|===
639644

640645
截止目前,本轮练习一共完成 {codes} 道题。

src/main/java/com/diguage/algo/leetcode/_0040_CombinationSumII_2.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,29 +20,29 @@ public List<List<Integer>> combinationSum2(int[] candidates, int target) {
2020
return result;
2121
}
2222

23-
private void backtrack(int[] can, List<List<Integer>> result,
24-
int start, int target, List<Integer> com) {
23+
private void backtrack(int[] candidates, List<List<Integer>> result,
24+
int start, int target, List<Integer> path) {
2525
// 子集和等于 target 时,记录解
2626
if (target == 0) {
27-
result.add(new ArrayList<>(com));
27+
result.add(new ArrayList<>(path));
2828
return;
2929
}
3030
// 剪枝二:从 start 开始遍历,避免生成重复子集
3131
// 剪枝三:从 start 开始遍历,避免重复选择同一元素
32-
for (int i = start; i < can.length; i++) {
32+
for (int i = start; i < candidates.length; i++) {
3333
// 剪枝一:若子集和超过 target ,则直接结束循环
3434
// 这是因为数组已排序,后边元素更大,子集和一定超过 target
35-
if (target < can[i]) {
35+
if (target < candidates[i]) {
3636
break;
3737
}
3838
// 剪枝四:如果该元素与左边元素相等,说明该搜索分支重复,直接跳过
39-
if (start < i && can[i - 1] == can[i]) {
39+
if (start < i && candidates[i - 1] == candidates[i]) {
4040
continue;
4141
}
42-
com.add(can[i]);
42+
path.add(candidates[i]);
4343
// 进行下一轮选择
44-
backtrack(can, result, i + 1, target - can[i], com);
45-
com.remove(com.size() - 1);
44+
backtrack(candidates, result, i + 1, target - candidates[i], path);
45+
path.remove(path.size() - 1);
4646
}
4747
}
4848
// end::answer[]
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.diguage.algo.leetcode;
2+
3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.List;
6+
7+
public class _0040_CombinationSumII_3 {
8+
// tag::answer[]
9+
10+
/**
11+
* @author D瓜哥 · https://www.diguage.com
12+
* @since 2024-09-16 17:31:07
13+
*/
14+
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
15+
Arrays.sort(candidates);
16+
List<List<Integer>> result = new ArrayList<>();
17+
backtrack(candidates, target, result, 0, new ArrayList<>());
18+
return result;
19+
}
20+
21+
private void backtrack(int[] candidates, int target,
22+
List<List<Integer>> result, int start, List<Integer> path) {
23+
if (target == 0) {
24+
result.add(new ArrayList(path));
25+
return;
26+
}
27+
for (int i = start; i < candidates.length; i++) {
28+
int num = candidates[i];
29+
if (target < num) {
30+
break;
31+
}
32+
if (start < i && candidates[i - 1] == candidates[i]) {
33+
continue;
34+
}
35+
path.add(num);
36+
backtrack(candidates, target - num, result, i + 1, path);
37+
path.remove(path.size() - 1);
38+
}
39+
}
40+
// end::answer[]
41+
}

0 commit comments

Comments
 (0)