• Combination Sum leetcode java


    题目:

    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, a1a2 ≤ … ≤ 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]

    题解

    还是老问题,用DFS找解决方案,不同点是,这道题: The same repeated number may be chosen from C unlimited number of times.

    所以,每次跳进递归不用都往后挪一个,还可以利用当前的元素尝试。

    同时,这道题还要判断重复解。用我之前介绍的两个方法:

     1.       if(i>0 && candidates[i] == candidates[i-1])//deal with dupicate
                     continue

     2.       if(!res.contains(item))
                    res.add(new ArrayList<Integer>(item));  

    这两个方法解决。

    代码如下:

     1     public ArrayList<ArrayList<Integer>> combinationSum(int[] candidates, int target) {  
     2         ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();  
     3         ArrayList<Integer> item = new ArrayList<Integer>();
     4         if(candidates == null || candidates.length==0)  
     5             return res; 
     6             
     7         Arrays.sort(candidates);  
     8         helper(candidates,target, 0, item ,res);  
     9         return res;  
    10     }  
    11     
    12     private void helper(int[] candidates, int target, int start, ArrayList<Integer> item,   
    13     ArrayList<ArrayList<Integer>> res){  
    14         if(target<0)  
    15             return;  
    16         if(target==0){  
    17             res.add(new ArrayList<Integer>(item));  
    18             return;  
    19         }
    20         
    21         for(int i=start;i<candidates.length;i++){  
    22             if(i>0 && candidates[i] == candidates[i-1])//deal with dupicate
    23                 continue;  
    24             item.add(candidates[i]);
    25             int newtarget = target - candidates[i];
    26             helper(candidates,newtarget,i,item,res);//之所以不传i+1的原因是:
    27                                                     //The same repeated number may be 
    28                                                     //chosen from C unlimited number of times.
    29             item.remove(item.size()-1);  
    30         }  
    31     } 

  • 相关阅读:
    外部编辑Infopath的表单模板(xsn)
    安装SQL Server 2008时可能遇到性能计数器不一致的情况
    Windows应用程序中使用Windows验证方式要注意的地方
    在MOSS 2007中使用Web Capture这个WebPart
    MOSS 配置SSO的时候可能遇到"您没有执行此操作的权限"的错误
    基于Web的操作系统,是否有可能?
    ASP.NET 中对于异常的处理
    在读取站点地图时自动应用安全设置
    JavaScript中的Window窗口对象【转载】
    当动态TSQL语句遇到除零的问题
  • 原文地址:https://www.cnblogs.com/springfor/p/3884294.html
Copyright © 2020-2023  润新知