分析:
看到返回所有,应该想到回溯,即DFS,DFS就要注意恢复现场。
public class Solution { public List<List<Integer>> combinationSum(int[] candidates, int target) { List<List<Integer>> res = new ArrayList<List<Integer>>(); if(candidates==null || candidates.length==0) return res; //排序保证结果按递增排列 Arrays.sort(candidates); dfs(candidates, 0, target, new ArrayList<Integer>(), res); return res; } public void dfs(int[] candidates, 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<candidates.length; i++){ //因为i-1位置的元素已经用过多次,如果相等的话,i位置就不应该再处理 if(i>0 && candidates[i]==candidates[i-1]) continue; item.add(candidates[i]); //i没有增加,保证i位置的元素可以用多次,当target减小 dfs(candidates, i, target-candidates[i], item, res); item.remove(item.size()-1); } } }