<leetcode> Combination Sum
2014-09-17 06:53
162 查看
Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums
to T.
The same repeated number may be chosen from C unlimited number of times.
Note:
All numbers (including target) will be positive integers.
Elements in a combination (a1, a2,
… , ak) must be in non-descending order. (ie, a1 ≤ a2 ≤
… ≤ ak).
The solution set must not contain duplicate combinations.
For example, given candidate set
target
A solution set is:
算法: 同Combinations, DFS+recusion
首先对数组排序(题目要求升序输出)。
然后DFS+recusion进行枚举,题目要求每个元素可以使用多次,所以level指向当前的level而不是下一层,并在recusion中添加参数target,为当前的target-candidates[i](省去list求和过程)。返回条件是target==0,添加当前list到result,或者target<0,当前组合不是solution,返回。
同Combination, 每次recusion传递前需要克隆一个list
public class Solution {
public int[] copy;
public List<List<Integer>> combinationSum(int[] candidates, int target) {
List<List<Integer>> result=new ArrayList<List<Integer>>();
ArrayList<Integer> solution=new ArrayList<Integer>();
if(candidates.length<=0){
return result;
}
else{
copy=new int[candidates.length];
mergeSort(candidates,0,candidates.length-1);
findCombination(candidates,target,0,result,solution);
}
return result;
}
public void findCombination(int[] candidates, int target, int level, List<List<Integer>> result, ArrayList<Integer> solution){
if(target==0){
result.add(solution);
return;
}
if(target<0){
return;
}
for(int i=level;i<candidates.length;i++){
ArrayList<Integer> solutionCopy=(ArrayList)solution.clone();//Clone list
solutionCopy.add(candidates[i]);
findCombination(candidates,target-candidates[i],i,result,solutionCopy);//level is current i(level)
}
}
/*
* Merge sort
*/
public void mergeArray(int[] numbers,int low,int mid,int high){
int k=low,l=mid+1;
for(int i=low;i<=high;i++){
copy[i]=numbers[i];
}
for(int j=low;j<=high;j++){
if(k>mid){
numbers[j]=copy[l];
l++;
}
else if(l>high){
numbers[j]=copy[k];
k++;
}
else if(copy[k]<copy[l]){
numbers[j]=copy[k];
k++;
}
else if(copy[k]>=copy[l]){
numbers[j]=copy[l];
l++;
}
}
}
public void mergeSort(int[] numbers,int low,int high){
if(high<=low){
return;
}
int mid=(low+high)/2;
mergeSort(numbers,low,mid);
mergeSort(numbers,mid+1,high);
mergeArray(numbers,low,mid,high);
}
}
to T.
The same repeated number may be chosen from C unlimited number of times.
Note:
All numbers (including target) will be positive integers.
Elements in a combination (a1, a2,
… , ak) must be in non-descending order. (ie, a1 ≤ a2 ≤
… ≤ ak).
The solution set must not contain duplicate combinations.
For example, given candidate set
2,3,6,7and
target
7,
A solution set is:
[7]
[2, 2, 3]
算法: 同Combinations, DFS+recusion
首先对数组排序(题目要求升序输出)。
然后DFS+recusion进行枚举,题目要求每个元素可以使用多次,所以level指向当前的level而不是下一层,并在recusion中添加参数target,为当前的target-candidates[i](省去list求和过程)。返回条件是target==0,添加当前list到result,或者target<0,当前组合不是solution,返回。
同Combination, 每次recusion传递前需要克隆一个list
public class Solution {
public int[] copy;
public List<List<Integer>> combinationSum(int[] candidates, int target) {
List<List<Integer>> result=new ArrayList<List<Integer>>();
ArrayList<Integer> solution=new ArrayList<Integer>();
if(candidates.length<=0){
return result;
}
else{
copy=new int[candidates.length];
mergeSort(candidates,0,candidates.length-1);
findCombination(candidates,target,0,result,solution);
}
return result;
}
public void findCombination(int[] candidates, int target, int level, List<List<Integer>> result, ArrayList<Integer> solution){
if(target==0){
result.add(solution);
return;
}
if(target<0){
return;
}
for(int i=level;i<candidates.length;i++){
ArrayList<Integer> solutionCopy=(ArrayList)solution.clone();//Clone list
solutionCopy.add(candidates[i]);
findCombination(candidates,target-candidates[i],i,result,solutionCopy);//level is current i(level)
}
}
/*
* Merge sort
*/
public void mergeArray(int[] numbers,int low,int mid,int high){
int k=low,l=mid+1;
for(int i=low;i<=high;i++){
copy[i]=numbers[i];
}
for(int j=low;j<=high;j++){
if(k>mid){
numbers[j]=copy[l];
l++;
}
else if(l>high){
numbers[j]=copy[k];
k++;
}
else if(copy[k]<copy[l]){
numbers[j]=copy[k];
k++;
}
else if(copy[k]>=copy[l]){
numbers[j]=copy[l];
l++;
}
}
}
public void mergeSort(int[] numbers,int low,int high){
if(high<=low){
return;
}
int mid=(low+high)/2;
mergeSort(numbers,low,mid);
mergeSort(numbers,mid+1,high);
mergeArray(numbers,low,mid,high);
}
}
相关文章推荐
- <LeetCode><Easy> 203 Remove Linked List Elements
- <LeetCode> 题6:合并两个排序数组
- <LeetCode> 412. Fizz Buzz
- <leetcode>617. Merge Two Binary Trees
- <LeetCode> 题366:斐波那契数列
- <LeetCode><Easy> 228 Summary Ranges
- <LeetCode><Easy> 160 Intersection Of Two Listed Lists
- <LeetCode><Easy> 27 Remove Elements
- <leetcode>String to Integer (atoi)
- <LeetCode> 题8:旋转字符串
- <LeetCode> 题202:线段树的查询
- <leetcode>283. Move Zeroes
- <leetcode>Money Robbing
- <LeetCode><Easy> 190 Revese Bits
- <LeetCode><Easy> 125 Valid Palindrome
- <LeetCode> 题452:删除链表中的元素
- <LeetCode><Medium>15 ThreeNums
- <LeetCode><Easy>290 Word Pattern
- <LeetCode>682. Baseball Game
- <LeetCode> 题12: 带最小值操作的栈