40. Combination Sum II
Description
描述:https://leetcode.com/problems/combination-sum-ii/description/
题意:从给定数组中找出所有可能的组合(一个数只能取一次,数组中有重复的数),使得组合的和等于目标值。
Solution: (Java)
class Solution {
List<List<Integer>> result = new ArrayList<>();
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
List<Integer> list = new ArrayList<>();
int sum = 0;
Arrays.sort(candidates);
backtracking(candidates, target, 0, list, sum);
return result;
}
public void backtracking(int[] candidates, int target, int start_i, List<Integer> list, int sum) {
for (int i = start_i; i < candidates.length; i++) {
if ((sum + candidates[i]) == target) {
List<Integer> addlist = new ArrayList<>();
for (int j = 0; j < list.size(); j++)
addlist.add(list.get(j));
addlist.add(candidates[i]);
result.add(addlist);
return;
} else if ((sum + candidates[i]) > target) {
return;
} else {
list.add(candidates[i]);
backtracking(candidates, target, i+1, list, sum + candidates[i]);
int rm = list.remove(list.size()-1);
while ((i+1 < candidates.length) && rm == candidates[i+1])
i++;
}
}
}
}
思路
- 本题与 39题 类似,稍微修改39题的代码即可,时间复杂度超过99.99%;
- 首先,每次递归时,遍历的开始下标需要在前一个+1,因为一个数只能取一次;
- 然后就是,在回溯时,除了删除最近的元素,还要处理下标,跳过与删除元素相等的数。