mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-08 16:54:50 +08:00
0040 组合总和II
简化原来的代码逻辑, 提高可读性。
This commit is contained in:
@ -258,40 +258,45 @@ public:
|
||||
**使用标记数组**
|
||||
```Java
|
||||
class Solution {
|
||||
List<List<Integer>> lists = new ArrayList<>();
|
||||
Deque<Integer> deque = new LinkedList<>();
|
||||
int sum = 0;
|
||||
LinkedList<Integer> path = new LinkedList<>();
|
||||
List<List<Integer>> ans = new ArrayList<>();
|
||||
boolean[] used;
|
||||
int sum = 0;
|
||||
|
||||
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
|
||||
//为了将重复的数字都放到一起,所以先进行排序
|
||||
Arrays.sort(candidates);
|
||||
//加标志数组,用来辅助判断同层节点是否已经遍历
|
||||
boolean[] flag = new boolean[candidates.length];
|
||||
backTracking(candidates, target, 0, flag);
|
||||
return lists;
|
||||
}
|
||||
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
|
||||
used = new boolean[candidates.length];
|
||||
// 加标志数组,用来辅助判断同层节点是否已经遍历
|
||||
Arrays.fill(used, false);
|
||||
// 为了将重复的数字都放到一起,所以先进行排序
|
||||
Arrays.sort(candidates);
|
||||
backTracking(candidates, target, 0);
|
||||
return ans;
|
||||
}
|
||||
|
||||
public void backTracking(int[] arr, int target, int index, boolean[] flag) {
|
||||
if (sum == target) {
|
||||
lists.add(new ArrayList(deque));
|
||||
return;
|
||||
}
|
||||
for (int i = index; i < arr.length && arr[i] + sum <= target; i++) {
|
||||
//出现重复节点,同层的第一个节点已经被访问过,所以直接跳过
|
||||
if (i > 0 && arr[i] == arr[i - 1] && !flag[i - 1]) {
|
||||
continue;
|
||||
}
|
||||
flag[i] = true;
|
||||
sum += arr[i];
|
||||
deque.push(arr[i]);
|
||||
//每个节点仅能选择一次,所以从下一位开始
|
||||
backTracking(arr, target, i + 1, flag);
|
||||
int temp = deque.pop();
|
||||
flag[i] = false;
|
||||
sum -= temp;
|
||||
}
|
||||
private void backTracking(int[] candidates, int target, int startIndex) {
|
||||
if (sum == target) {
|
||||
ans.add(new ArrayList(path));
|
||||
}
|
||||
for (int i = startIndex; i < candidates.length; i++) {
|
||||
if (sum + candidates[i] > target) {
|
||||
break;
|
||||
}
|
||||
// 出现重复节点,同层的第一个节点已经被访问过,所以直接跳过
|
||||
if (i > 0 && candidates[i] == candidates[i - 1] && !used[i - 1]) {
|
||||
continue;
|
||||
}
|
||||
used[i] = true;
|
||||
sum += candidates[i];
|
||||
path.add(candidates[i]);
|
||||
// 每个节点仅能选择一次,所以从下一位开始
|
||||
backTracking(candidates, target, i + 1);
|
||||
used[i] = false;
|
||||
sum -= candidates[i];
|
||||
path.removeLast();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
**不使用标记数组**
|
||||
```Java
|
||||
|
Reference in New Issue
Block a user