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 2,3,6,7
and target 7
,
A solution set is:
[7]
[2, 2, 3]
以下代码超时:
public class Solution {
ArrayList<ArrayList<Integer>> res;
ArrayList<Integer> newcandidates;
ArrayList<Integer> sum;
public ArrayList<ArrayList<Integer>> combinationSum(int[] candidates, int target) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
res = new ArrayList<ArrayList<Integer>>();
if(candidates.length == 0)
return res;
newcandidates = new ArrayList<Integer>();
Arrays.sort(candidates);
for(int i = 0; i < candidates.length; i++)
{
int num = target / candidates[i];
for(int k = 0; k < num; k++)
newcandidates.add(candidates[i]);
}
//System.out.println(newcandidates);
if(newcandidates.size() == 0)
return res;
sum = new ArrayList<Integer>();
dfs(target, 0, 0);
sum = null;
newcandidates = null;
return res;
}
public void dfs(int target, int step, int tmpsum)
{
if(step == newcandidates.size())
{
if(tmpsum == target)
{
if(!res.contains(sum))
res.add(new ArrayList<Integer>(sum));
}
return ;
}
if(tmpsum > target)
return;
sum.add(newcandidates.get(step));
dfs(target, step + 1, tmpsum + newcandidates.get(step));
sum.remove(sum.size() - 1);
dfs(target, step + 1, tmpsum);
return;
}
}
以下代码不超时:
public class Solution {
public ArrayList<ArrayList<Integer>> combinationSum(int[] candidates, int target) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
if(candidates.length == 0)
return res;
Arrays.sort(candidates);
ArrayList<Integer> sum = new ArrayList<Integer>();
dfs(res, candidates, target, sum, 0, 0);
return res;
}
public void dfs(ArrayList<ArrayList<Integer>> res, int[] array, int target, ArrayList<Integer> sum, int step, int tmpsum)
{
if(tmpsum == target)
{
if(!res.contains(sum))
res.add(new ArrayList<Integer>(sum));
return;
}
if(tmpsum > target)
return;
for(int i = step; i < array.length; i++)
{
sum.add(array[i]);
dfs(res, array, target, sum, i, tmpsum + array[i]);
sum.remove(sum.size() - 1);
}
return;
}
}
如果循环里面的 dfs 函数 里,循环步长 i 变成 i +1 ,那么就变形为每个数只能用一次。