https://leetcode-cn.com/problems/subsets/ 数组、位运算、回溯算法
原生一行
利用 reduce 迭代,在编译器里面可以跑,但是 leetcode 会编译报错
function subsets(nums: number[]): number[][] {
return nums.reduce((total,num)=>total.concat(total.map(item=>item.concat(num))),[[]])
};
回溯一
function subsets(nums: number[]): number[][] {
const res:number[][] = [];
const dfs = (index: number, list: number[]) => {
if(index === nums.length) {
// 如果这里不用 slice() 会全部变成空数组,因为那样push的只是 list 的引用,list 最后都会变为空数组,应该push一个新数组
res.push(list.slice())
return
}
list.push(nums[index])
dfs(index + 1, list)
list.pop()
dfs(index + 1, list)
}
dfs(0, [])
return res
};
回溯二
function subsets(nums: number[]): number[][] {
const res:number[][] = [];
const dfs = (index: number, list: number[]) => {
res.push(list.slice())
for(let i = index; i < nums.length; i++) {
list.push(nums[i])
dfs(i + 1, list)
list.pop()
}
}
dfs(0, [])
return res
};