题目
Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
Each number in C 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.
For example, given candidate set [10, 1, 2, 7, 6, 1, 5] and target 8,
A solution set is:
[
[1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]
]
思路
深度搜索
需要注意两点:
1. containing duplicate elements
2. Each number in C may only be used once in the combination.
代码
public class Solution {
//assert:
//1. containing duplicate elements
//2. Each number in C may only be used once in the combination.
IList<IList<int>> result = new List<IList<int>>();
int[] nums;
public IList<IList<int>> CombinationSum2(int[] candidates, int target) {
nums=candidates;
Array.Sort(nums);
dfs(new List<int>(),target,0);
return result;
}
private void dfs(IList<int> tmp, int remain, int start){
if(remain<0)return;
if(remain==0) result.Add(new List<int>(tmp));
else{
for(int i=start;i<nums.Length;i++){
if(i>start && nums[i]==nums[i-1]) continue;
tmp.Add(nums[i]);
dfs(tmp,remain-nums[i],i+1);
tmp.RemoveAt(tmp.Count-1);
}
}
}
}