程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> LeetCode-Combination Sum

LeetCode-Combination Sum

編輯:C++入門知識

LeetCode-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]*

思路

由於每個元素可以用多次,針對某個組合來說(以【2,2,3】為例)
1. 首先選中2,那麼target還剩下5。第二次還可以選2,3 ,但是不能選6,因為6已經超過target了。迭代重復這個過程。可以選出【2,2,3】。
2. 再次重復這個過程,第一次選3,然後target剩下4,剩下的就不可以選了。

Code

public class Solution {
    public List> combinationSum(int[] candidates, int target) {
        List> result = new ArrayList>();
        if(candidates == null || target < 0){
            return result;
        }
        Arrays.sort(candidates);
        helper(candidates, target, result , new ArrayList() , 0);
        return result;
    }

    private void helper(int[] candidates, int target, List> result, List solution , int begin){
        if(target == 0){
            result.add(new ArrayList(solution));
            return;
        }

        for(int i = begin ; i < candidates.length && target >= candidates[i] ; i++){
            solution.add(candidates[i]);
            helper(candidates, target-candidates[i] , result , solution , i);
            solution.remove(solution.size() - 1);
        }


    }
}

附加ArrayList的remove方法解析

ArrayList的remove方法有兩個重載版本。分別是

public E remove(int);
public boolean remove(Object);

第一個方法是刪除指定位置的元素,第二個方法是刪除與參數equal的首次出現的元素。那麼問題來了,如果List的定義為:

List mList = new ArrayList();

那到底是刪除指定位置的元素還是刪除與參數相等的數字呢?

這個要看重載的規律:

參數類型加寬(類型相容) > 自動裝箱 > 變長參數

所以,如果mList中的元素有[1,2,3,4,5],我們調用方法:

mList.remove(1)結果變為[1,3,4,5]

再調用mList.remove(new Integer(1)) mList中的元素最終為[3,4,5]

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved