[1, 1, 6]
分析:
这跟Conbination Sum 不同的地方有两处:
1,在DFS递归的时候,因为i位置元素只能用一次,所以递归要 i+1;
2,在判断continue的时候,是 i > start && num[i] == num[i-1],这个保证 num[start] == num[start-1]的时候也是有效地(即例子中 1,1,6)的情况。
public class Solution { public List<List<Integer>> combinationSum2(int[] num, int target) { List<List<Integer>> res = new ArrayList<List<Integer>>(); if(num==null || num.length==0) return res; Arrays.sort(num); dfs(num, 0, target, new ArrayList<Integer>(), res); return res; } public void dfs(int[] num, int start, int target, List<Integer> item, List<List<Integer>> res){ if(target<=0){ if(target==0) res.add(new ArrayList<Integer>(item)); return; } for(int i=start; i<num.length; i++){ //i>start保证num[start]==num[start-1]的时候也可以处理到 if(i>start && num[i]==num[i-1]) continue; item.add(num[i]); //每次i+1,保证i位置只使用一次 dfs(num, i+1, target-num[i], item, res); item.remove(item.size()-1); } } }