当前位置:编程学习 > JAVA >>

Combination Sum

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] 
 
java code : 这种递归会超时,分析原因可能是因为频繁压栈出栈,因为每一次递归有两个递归分支,换成循环迭代版本的就不会超时了:
以下代码超时:
 
 
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 ,那么就变形为每个数只能用一次。
补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,