思路
track:记录一个全排列结果。
选择列表(nums):选择一个满足条件的元素,加入到track中。
代码
var permute = function(nums) {
let res = [];
let fn = function(nums, track){
if(track.length==nums.length){
res.push([...track]);
return;
}
for(let i=0; i<nums.length; i++){
if(track.indexOf(nums[i])==-1){
track.push(nums[i]);
fn(nums, track);
track.pop();
}
}
}
fn(nums, []);
return res;
};
思路
track:记录一个有效的组合。
选择列表:要注意[1, 2]和[2, 1]不能重复出现。
代码
var combine = function(n, k) {
let res = [];
let nums = [];
for(let i=1; i<=n; i++){
nums.push(i);
}
var fn = function(nums, k, track){
if(track.length==k){
res.push([...track]);
}
for(let i=0; i<nums.length; i++){
if(track.length==0 || nums[i]>track[track.length-1]){
track.push(nums[i]);
fn(nums, k, track);
track.pop();
}
}
}
fn(nums, k, []);
return res;
};
回溯思路
代码
var subsets = function(nums) {
let res = []
var back = function(nums, track){
if(track.length<=nums.length){
res.push([...track]);
}
for(let i=0; i<nums.length; i++){
if(track.length==0 || nums[i]>track[track.length-1]){
track.push(nums[i]);
back(nums, track);
track.pop();
}
}
}
back(nums, []);
return res;
};
递归方程思路
subset([1, 2, 3]) = subset([1, 2]) + subset([1, 2])中每个列表元素加上3这个元素。
代码
var subsets = function(nums) {
if(nums.length==0) return [[]];
let num = nums.pop()
let subnums = subsets(nums);
let res = [];
for(let i=0; i<subnums.length; i++){
res.push([...subnums[i]]);
subnums[i].push(num);
res.push([...subnums[i]]);
}
return res;
};
巩固练习