Given a collection of candidate numbers (candidates
) and a target number (target
), find all unique combinations in candidates
where the candidate numbers sums to target
.
Each number in candidates
may only be used once in the combination.
Note:
- All numbers (including
target
) will be positive integers. - The solution set must not contain duplicate combinations.
Example 1:
Input: candidates = [10,1,2,7,6,1,5]
, target = 8
,
A solution set is:
[
[1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]
]
Example 2:
Input: candidates = [2,5,2,1,2], target = 5, A solution set is: [ [1,2,2], [5] ]
踢掉自身就行了,为啥要踢掉相同的另一个元素?
递归的时候跳过相同的元素,在recursion中不能重复,避免实在是太多的嫌疑?
for循环却又保证了每个元素都能被利用。这样无形之中踢掉了自身。在for循环中重复
Here is the order that the elements get added to the list
[]
[1]
[1,2]
[1,2,3]
[1,3]理解一下回溯法:退回去一步,然后走到最深
[2]
[2,3]
[3]
class Solution {
public List> combinationSum2(int[] nums, int target) {
List> list = new ArrayList<>();
Arrays.sort(nums);
backtrack(list, new ArrayList<>(), nums, target, 0);
return list;
}
private void backtrack(List> list, List tempList, int [] nums, int remain, int start){
if(remain < 0) return;
else if(remain == 0) list.add(new ArrayList<>(tempList));
else{
for(int i = start; i < nums.length; i++){
if (i > start && (nums[i] == nums[i - 1])) continue;
tempList.add(nums[i]);
backtrack(list, tempList, nums, remain - nums[i], i + 1);
tempList.remove(tempList.size() - 1);
}
}
}
}