回溯套路
求子集
初始化
---sets
---subset
---backTrack
--- funtion backTrack
直接存入sets
终止条件
for 从i开始
存入subset
backTrack
subset弹出pop
var subsets = function (nums) {
const sets = [];
let subsets = [];
backTrack(0, subsets);
function backTrack(start, subsets) {
sets.push([...subsets]);
if (start >= nums.length) return;
for (let j = start; j < nums.length; j++) {
subsets.push(nums[j]);
backTrack(j + 1, subsets);
subsets.pop();
}
}
return sets;
};
console.log(subsets([1, 2, 3]));
求排列 (多了 used 的限制条件)
初始化
---sets
---subset
---used (新增)
---backTrack
--- funtion backTrack
长度相等 存入sets
终止条件
for 从0开始
未使用
存入subset
used[j]=1
backTrack
used[j]=0
subset弹出pop
var permute = function (nums) {
const sets = [];
let subsets = [];
const used = Array(nums.length).fill(0);
backTrack(nums, subsets, sets);
function backTrack(nums, subsets, sets) {
if (subsets.length === nums.length) {
sets.push([...subsets]);
return;
}
for (let j = 0; j < nums.length; j++) {
if (used[j] === 0) {
subsets.push(nums[j]);
used[j] = 1;
backTrack(nums, subsets, sets);
used[j] = 0;
subsets.pop();
}
}
}
return sets.length;
};
console.log(permute([1, 2, 3]));
求组合 (子集组合等于某值)
初始化
---sets
---subset
---backTrack
--- funtion backTrack
直接存入sets
终止条件
for 从start开始
存入subset
backTrack (剩余目标值target-cur[j])
subset弹出pop
var combinationSum = function (candidates, target) {
const sets = [];
const subsets = [];
const len = candidates.length;
backTrack(0, target, subsets);
function backTrack(start, target, subsets) {
if (target < 0) return;
if (target === 0) {
sets.push([...subsets]);
return;
}
for (let j = start; j < len; j++) {
subsets.push(candidates[j]);
backTrack(j, target - candidates[j], subsets);
subsets.pop();
}
}
return sets;
};
console.log(combinationSum([2, 3, 6, 7], 7));