题目描述
题解
很经典的题目
import java.util.*;
public class Leetcode_39 {
public List<List<Integer>> combinationSum(int[] candidates, int target) {
List<Integer> templist = new ArrayList<>();
List<List<Integer>> ret = new ArrayList<>();
findcs(candidates,target,templist,ret,0);
return ret;
}
private void findcs(int[] candidates, int target, List<Integer> templist, List<List<Integer>> ret, int start)
{
if(target<0) return;
else if(target==0) ret.add(new ArrayList<>(templist));
else {
for (int i = start; i < candidates.length; i++) {
templist.add(candidates[i]);
findcs(candidates, target-candidates[i], templist, ret, i);
templist.remove(templist.size() - 1);
}
}
}
public static void main(String[] args)
{
Leetcode_39 test = new Leetcode_39();
int[] c = {2,3,6,7};
int target = 7;
List<List<Integer>> ret = new ArrayList<>();
ret = test.combinationSum(c,target);
System.out.println(ret.toString());
}
}
题目描述
主要是个重复元素的删除问题
import java.util.*;
public class Leetcode_40 {
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
List<Integer> templist = new ArrayList<>();
List<List<Integer>> ret = new ArrayList<>();
Arrays.sort(candidates);
findcs(candidates,target,templist,ret,0);
return ret;
}
private void findcs(int[] nums, int remain, List<Integer> templist, List<List<Integer>>ret, int start)
{
if(remain<0) return;
else if(remain==0) ret.add(new ArrayList<>(templist));
else
{
for(int i = start; i<nums.length;i++)
{
if(i > start && nums[i] == nums[i-1]) continue; //跳过重复元素
templist.add(nums[i]);
findcs(nums,remain-nums[i],templist,ret,i+1);
templist.remove(templist.size()-1);
}
}
}
public static void main(String[] args)
{
Leetcode_40 test = new Leetcode_40();
int[] c = {10,1,2,7,6,1,5};
int target = 8;
List<List<Integer>> ret = new ArrayList<>();
ret = test.combinationSum2(c,target);
System.out.println(ret.toString());
}
}