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]
]
题目解析:
1.在上一题基础上增加了不允许重复的要求;
2.不能每次都从数组第一位开始遍历啦;
3.必须添加去重的条件,这点至关重要。
代码:
class Solution {
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
//返回列表
List<List<Integer>> resultList = new LinkedList<>();
//暂存列表
List<Integer> tempList = new LinkedList<>();
//先排序
Arrays.sort(candidates);
CombinaList(candidates,target,0,tempList,resultList);
return resultList;
}
//1,2,2,2,5 target = 5
public void CombinaList(int[] candidates, int target,int index,List<Integer> tempList,List<List<Integer>> resultList)
{
if(target < 0)
{
return;
}
else if(target == 0)//正确选项
{
resultList.add(new LinkedList<>(tempList));
}
else
{
for(int i = index;i<candidates.length;i++)//每次不能从index = 0;否则返回序列会重复
{
tempList.add(candidates[i]);//candidates[i] = 2
CombinaList(candidates,target - candidates[i],i+1,tempList,resultList);//target = 6 注意i+1
//target - candidates[i] 重要
tempList.remove(tempList.size() -1);
//不符合去除最后一个元素,向后遍历
while(i < candidates.length -1 && candidates[i] == candidates[i+1])//去重
{
i++;
}
}
}
}
}
性能:
总结:一些细节的处理,彰显对程序算法处理理解的粒度,值得深究,共勉!