leetcode-78子集

61 阅读1分钟

题目

image.png

解题思路

  1. 这类题可以使用一个模板解决,递归思想
  2. 模板的思路如下
var subsets = function(nums) {
  const result = [];

  function backtrack(start, curr) {
    result.push([...curr]);
    for (let i = start; i < nums.length; i++) {
      // 1、把nums[i]加入curr数组
      curr.push(nums[i]);
      // 2、递归调用
      backtrack(i + 1, curr);
      // 3、把curr数组的最后一个元素移除(这一步会等第一轮递归结束后再执行)
      curr.pop();
    }
    console.log(result)

  }

  backtrack(0, [])
  return result;
};
  1. 以[1,2,3]为例,执行backtrack(0,[])让递归函数运行起来
  2. 注意移除最后一个元素是等第一轮递归结束后执行的,移除后继续执行循环体的代码。

2c7894252c1eab30f1fc3ed79cf2e18.jpg 5. 通过树结构解析: f3a6117799f5794f1b386f2332fad89.jpg

JavaScript代码

var subsets = function(nums) {
  const result = [];

  function backtrack(start, curr) {
    result.push([...curr]);
    for (let i = start; i < nums.length; i++) {
      // 1、把nums[i]加入curr数组
      curr.push(nums[i]);
      // 2、递归调用
      backtrack(i + 1, curr);
      // 3、把curr数组的最后一个元素移除
      curr.pop();
    }
    console.log(result)

  }

  backtrack(0, [])
  return result;
};

类似题

第90题,在本题的基础上添加一个判断条件去除重复子集即可。

var subsetsWithDup = function(nums) {
  const result = [];
  // 先排序
  nums.sort((a, b) => a - b)

  function backtrack(start, curr) {

    result.push([...curr]);
    for (let i = start; i < nums.length; i++) {
      if (i > start && nums[i] === nums[i - 1]) {
        // 去掉重复项
        continue;
      }
      curr.push(nums[i]);
      backtrack(i + 1, curr)
      curr.pop()
    }

  }

  backtrack(0, [])
  return result;
};