一、给定一个无重复元素的数组和一个目标数target,找出数组中所有可以使数字和为target的组合
递归回溯法,通过排序来去重。
数组中的数字可以无限制重复被选取。
说明:
- 所有数字(包括
target
)都是正整数。 - 解集不能包含重复的组合。
import java.util.ArrayList; import java.util.Arrays; import java.util.List; class Solution { public List<List<Integer>> combinationSum(int[] candidates, int target) { List<List<Integer>> result = new ArrayList<List<Integer>>(); List<Integer> temp = new ArrayList<>(); Arrays.sort(candidates); wuCombinationSumTemp(candidates,target,result,temp,0); return result; } public static void wuCombinationSumTemp(int[] candidates, int target,List<List<Integer>> result, List<Integer> temp,int index) { if(target<0) { return; } if(target==0) { List<Integer> list = new ArrayList<>(temp); result.add(list); return; } int len = candidates.length; int tempLen = temp.size(); for(int i=index;i<len;i++) { temp.add(candidates[i]); wuCombinationSumTemp(candidates, target-candidates[i],result,temp,i); temp.remove(tempLen); } return; } }
二、给定一个数组和一个目标数target,找出数组中所有可以使数字和为target的组合
数组中的每个数字在每个组合中只能使用一次。
说明:
所有数字(包括目标数)都是正整数。
解集不能包含重复的组合。
这里的解题思想主要是动态规划的思想,然后还有很重要的一点就是这里的去重的方法。
class Solution { public List<List<Integer>> combinationSum2(int[] candidates, int target) { Arrays.sort(candidates); List<List<Integer>> result = null; result = zuhe(candidates,target,candidates.length); return result; } public static List<List<Integer>> zuhe(int[] candidates, int target,int len) { List<List<Integer>> result = new ArrayList<>(); List<List<Integer>> temp = null; if(len == 0){ if(target==0) { List<Integer> list = new ArrayList<Integer>(); result.add(list); } return result; }else{ if(target<0){ return result; } if(target==0){ List<Integer> list = new ArrayList<Integer>(); result.add(list); return result; } int k = 0; if(len!=1){ for(int i=len-2;i>=0;i--){ if(candidates[i]!=candidates[len-1]){ k = i+1; break; } } } for(int i=k;i<=len;i++){ temp = zuhe(candidates, target-candidates[len-1]*(i-k),k); for(List<Integer> list:temp){ for(int j=k;j<i;j++){ list.add(candidates[len-1]); } } result.addAll(temp); } return result; } } }