39. 组合总和
题目描述
给定一个无重复元素的正整数数组 candidates 和一个正整数 target ,找出 candidates 中所有可以使数字和为目标数 target 的唯一组合。
candidates 中的数字可以无限制重复被选取。如果至少一个所选数字数量不同,则两种组合是唯一的。
对于给定的输入,保证和为 target 的唯一组合数少于 150 个。
示例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]]
示例3
输入: candidates = [2], target = 1
输出: []
示例4
输入: candidates = [1], target = 1
输出: [[1]]
示例5
输入: candidates = [1], target = 2
输出: [[1,1]]
思路
dfs + 回溯
/**
* @param {number[]} candidates
* @param {number} target
* @return {number[][]}
*/
var combinationSum = function(candidates, target) {
let result = [];
let temp = [];
let count = 0;
let len = candidates.length;
let backTracking = function(candidates, target, count, index){
// 终止条件 temp数组里面的组合 等于 target值
if(count === target){
result.push([...temp]);
return;
//temp数组里面的组合 已经大于 target值 没必要继续搜索下去 直接终止
}else if(count > target){
return;
}
// 回溯
for(let i = index; i < len; i++){
count += candidates[i];
temp.push(candidates[i]);
// 递归 从自己开始(包括自己在内)进行递归取数求和 不回头和之前的数字进行组合 避免了结果的不重复
backTracking(candidates, target, count, i);
count -= candidates[i];
temp.pop();
}
}
backTracking(candidates, target, count, 0);
return result;
};