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,剩下的就不可以選了。
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方法有兩個重載版本。分別是
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]
。