zoukankan      html  css  js  c++  java
  • 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     } 

  • 相关阅读:
    进入javascript的学习了
    详解CSS display:inline-block的应用(转)
    CSS学习第一天
    HTML小结~
    表单提交中的input、button、submit的区别(转来学习)
    第二天又是充实的一天
    java开班啦~步入程序员的第一步
    sql 两大类 DDL数据定义语言 和DCL数据控制语言
    单行函数(日期函数)
    单行函数
  • 原文地址:https://www.cnblogs.com/springfor/p/3884294.html
Copyright © 2011-2022 走看看