所有子集-leetcode -079 以及子集 II-90

80 阅读1分钟

不包含重复元素求子集

递归实现

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;
}