不包含重复元素求子集
递归实现
function subsets(arr: number[], index = 0): number[][] {
if (index >= arr.length - 1) return [[], [arr[arr.length - 1]]];
const temp = subsets(arr, index + 1);
return temp.map((set) => set.concat(arr[index])).concat(temp);
}
非递归实现
function subsets(arr: number[], index = 0): number[][] {
let res = [[]];
arr.forEach((item) => {
res = res.map((set) => set.concat(item)).concat(res);
});
return res;
}
包含重复元素求子集
实现
function subsetsWithDup(nums: number[]): number[][] {
let map = new Map();
let set = new Set<number>();
nums.forEach((item) => {
if (set.has(item)) {
map.set(item, (map.get(item) ?? 1) + 1);
} else {
set.add(item);
}
});
let res = subsets([...set].filter((item) => !map.has(item)));
map.forEach((val, key) => {
let temp = [];
let tr = [];
for (let i = 0; i < val; i++) {
temp.push(key);
tr = res.map((ts) => ts.concat(temp)).concat(tr);
}
res = res.concat(tr);
});
return res;
}