和一的思路差不多,也是递归的求解路径即可。。由于出现了重复的数字,为了避免路径重复,我们要对num排序,选择路径时在每个点避免重复选择相同的值即可
public class Solution
{
List<List<Integer>> res = new ArrayList<List<Integer>>();
public List<List<Integer>> combinationSum2(int[] num, int target) {
Arrays.sort(num);
List<Integer> tmp = new ArrayList<Integer>();
fun(0,0,target,num,tmp);
return res;
}
void fun(int index,int sum,int target,int[] num,List<Integer> tmp)
{
int len = num.length;
if(sum==target)
{
res.add(tmp);
return ;
}
if(sum>target)
{
return ;
}
if(index>=len)
{
return ;
}
// fun(index+1,sum,target,num,tmp);
// List<Integer> temp = new ArrayList<Integer>(tmp);
// temp.add(num[index]);
// sum += num[index];
// fun(index+1,sum,target,num,temp);
for(int i=index;i<len;i++)
{
List<Integer> temp = new ArrayList<Integer>(tmp);
temp.add(num[i]);
fun(i+1,sum+num[i],target,num,temp);
while(i<len-1&&num[i]==num[i+1])
{
i++;
}
}
}
}