leetcode 90 子集2 js

leetcode 90 子集2

给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

**说明:**解集不能包含重复的子集。

解题思路:

对于数组中的每一个数字,有两种状态,取或不取。这个问题为一个树形问题,故采用回溯法解决。难点在于如何去重,即剪枝。

  • 将数组从小到大排序,重复数字,只取第一个。

  • 一个数字有两种状态:

    1、不取,直接存入结果数组

    2、取,继续往后搜索。

刻意联系的思路:

1、递归树,状态变量:当前下标和新数组

image-20210314153106066

2、递归出口:当前下标到达末尾,即搜索完毕。

3、选择列表:从当前下标数字往后的数字选取,存入新数组中

若存在重复数字,只取第一次出现的数字,接着continue

4、剪枝,去重

5、撤销操作:新数组中pop

var subsetsWithDup = function (nums) {
  let len = nums.length
  nums.sort((a, b) => a - b);
  const res = [];
  helper();
  return res;

  function helper(temp = [], start = 0) {
    //不选择当前数字,直接push
    res.push(temp);
    //当全选时,退出
    if (temp.length === len) return;
    //选择列表
    for (let i = start; i < len; i++) {
      //相同元素只取第一个
      if (i > start && nums[i] === nums[i - 1]) continue
      temp.push(nums[i]);
      helper(temp.slice(), i + 1);
      temp.pop();
    }
  }

};


console.log(subsetsWithDup([1, 2, 2]));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值