1.子集(leetcode78)
nums元素不重复
没有终止条件、path更新就push进res中
var subsets = function(nums) {
let res = [],path= [];
function backtracking(startIndex){
res.push([...path]);
for(let i = startIndex;i<nums.length;i++){
path.push(nums[i]);
backtracking(i+1);
path.pop();
}
}
backtracking(0);
return res;
};
2.子集II(leetcode90)
nums元素重复,要求子集不重复
去重:使用used,对树层去重
var subsetsWithDup = function(nums) {
nums.sort((a,b)=>a-b);
let used = new Array(nums.length).fill(false);
let res = [],path=[];
function backtracking(startIndex){
res.push([...path]);
for(let i = startIndex;i<nums.length;i++){
if(i>0 && nums[i] == nums[i-1] && !used[i-1]) continue;
if (used[i] == true) continue;
path.push(nums[i]);
used[i] = true;
backtracking(i+1);
path.pop();
used[i] = false;
}
}
backtracking(0);
return res;
};
3.递增子序列(leetcode491)
递增子序列
输出:数组中递增子序列
注意:数组中可能存在重复元素,所以要对path进行去重,使用used也可,使用set也可
var findSubsequences = function(nums) {
let res = [],path = [];
const set = new Set();
function backtracking(startIndex){
if(path.length > 1){
// path数组,转成字符串
const str = path.toString();
if(!set.has(str)){
res.push([...path]);
set.add(str);
}
}
for(let i = startIndex;i<nums.length;i++){
if(path.length == 0 || path[path.length-1]<=nums[i]){
path.push(nums[i]);
backtracking(i+1);
path.pop();
}
}
}
backtracking(0);
return res;
};