題目
給定一個無重複元素的數組 candidates 和一個目標數 target ,找出 candidates 中所有可以使數字和爲 target 的組合。
candidates 中的數字可以無限制重複被選取。
說明:
所有數字(包括 target)都是正整數。
解集不能包含重複的組合。
示例 1:
輸入: candidates = [2,3,6,7], target = 7,
所求解集爲:
[
[7],
[2,2,3]
]
示例 2:
輸入: candidates = [2,3,5], target = 8,
所求解集爲:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
解題思路:
本題採用遞歸的方式,每次遞歸重新計算target = target - args[i], 如果target == 0 找到該temp集合,target < 0 將temp 最後一位移除。 建議拿[1,2] 和 target =3 手寫每次遞歸的調用,更直接理解算法思路。
具體代碼:
class Solution {
public List<List<Integer>> combinationSum(int[] candidates, int target) {
List<List<Integer>> res = new ArrayList<>();
Arrays.sort(candidates); //這裏排序應該會更快點。
calculate(candidates, 0, target, new ArrayList<Integer>(), res);
return res;
}
/**
* @param args
* @param start
* @param target
* @param temp
* @param res
* @return
*/
public void calculate(int[] args, int start, Integer target, ArrayList<Integer> temp, List<List<Integer>> res) {
// 遞歸處理思路:1、先找到跳出遞歸臨界點退出。 2、遞歸操作。
if (target == 0) {
res.add(new ArrayList<Integer>(temp));
return;
}
if (target < 0) {
return;
}
for (int i = start; i < args.length; i++) {
temp.add(args[i]);
calculate(args, i, target - args[i], temp, res);
temp.remove(temp.size() - 1);
}
}
}