LeetCode题解:78. 子集,迭代+位运算,JavaScript,详细注释

原题链接:https://leetcode-cn.com/problems/subsets/

解题思路:

  1. 用两遍循环暴力穷尽所有集合。
  2. 第一遍循环是for (let i = 0; i < 1 << nums.length; i++) {},即穷尽了所有子集数量,但不做是否存值的判断。
  3. 第二遍循环for (let j = 0; j < nums.length; j++) {},即遍历每个索引,在通过i & (1 << j)判断当前索引是否需要存值。
/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var subsets = function (nums) {
  let result = []; // 存储结果

  // 第一遍循环
  // 以nums为[1 ,2 ,3]为例,1 << nums.length生成的为二进制数1000
  // 该循环遍历了所有可能的子级
  for (let i = 0; i < 1 << nums.length; i++) {
    let subset = []; // 存储当前可能的子级

    // 第二遍循环
    // 利用该循环,遍历出每个索引对应的二进制数
    for (let j = 0; j < nums.length; j++) {
      // 1 << j生成的是二进制数1、10、100,分别对应3个索引
      // 每个i都与1 << j进行与操作。即完成了当前输赢是否要存入值的判断
      // 也就是每个索引都有存或不存值两种该状态
      if (i & (1 << j)) {
        // 将需要存储的值,存入当前集合中
        subset.push(nums[j]);
      }
    }

    // 将当前集合存入结果
    result.push(subset);
  }

  return result;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值