当前位置: 首页 > news >正文

算法题(125):子集

审题:

本题需要我们将题目给定数组的所有子集枚举起来

思路:

方法一:二进制枚举

枚举对象:0到1<<n -1的整形数据

枚举顺序:顺序

枚举方式:二进制枚举

在解释二进制枚举的方法之前,我们先看看0~8的数字的二进制有什么特点

如果我们将0值定义为该索引位置不选,1定义为该索引位置可选。那么此时对于数字0~7的二进制情况,我们发现恰好完成了子集的枚举。

例子解释:

比如对于0数字,0~2的索引位置值都为0,说明这是三个数字都不选的情况

对于1数字,0索引位置值为1,其他位置值为0,说明这是只选择索引为0的数字的情况

其他数字情况也是同理

疑问:我们需要的数字范围是多少才能完全覆盖所有子集情况?

范围是0到(1<<n) -1。

我们先以给定数据个数为3举例,我们发现当数为8时,二进制的倒数第四位就有1了,说明到7的时候已经完成了数据个数为3所有的遍历。而8就是由1左移3位得到的,7是由8-1得到的。也就是说最远的遍历边界就是(1<<n)-1

综上,解题思路如下:

首先将需要遍历到的数依次取出,然后根据这些数的不同二进制位数值情况对子集进行数据插入。

当前子集插入完成后将子集放入二维的结果数组中,全部插入完成就直接返回结果数组

解题:

vector<vector<int>> subsets(vector<int>& nums) { 
        int n = nums.size();
        vector<vector<int>> vv;
        //二进制枚举所有情况
        for(int i = 0; i < (1<<n); i++)
        {
            vector<int> tmp;
           //对数的选择进行展开
           for(int j = 0; j < n; j++)
           {
            //二进制值对应位置为1就插入子集
            if(i>>j & 1) tmp.push_back(nums[j]);
           }
           vv.push_back(tmp);
        }
        return vv;
    }

78. 子集 - 力扣(LeetCode)

相关文章:

  • AJAX与Axios基础
  • 网页爬虫--赶集网租房信息爬取(Python)
  • 开源模型应用落地-模型上下文协议(MCP)-第三方MCP Server实战指南(五)
  • 机器学习 从入门到精通 day_05
  • 生成式引擎优化(GEO)发展史与行业标准演变
  • (三) 傅里叶变换:把信号拆成音符的秘密
  • 【LLM】解锁Agent协作:深入了解谷歌 A2A 协议与 Python 实现
  • 邮件发送频率如何根据用户行为动态调整?
  • # 更换手机热点后secureCRT无法连接centOS7系统
  • 入门-C编程基础部分:2、第一个程序
  • 从零开始学习SLAM | 用四元数插值来对齐IMU和图像帧
  • 基于ESP32-S3 蓝牙SDK封装设计
  • 阿里计算机专业面试宝典1
  • javaweb的基础2
  • 【计算机网络】什么是路由?核心概念与实战详解
  • 群晖如何通过外网访问
  • KingbaseES之KDts迁移SQLServer
  • 安徽京准:GPS北斗卫星时空信号安全防护装置(授时)介绍
  • 【Unity笔记】Unity超时检测器开发:支持自定义重试次数与事件触发
  • AIP-231 批量方法:Get
  • 广西北海市人大常委会副主任李安洪已兼任合浦县委书记
  • 陕西全省公开征集涉企行政执法问题线索,切实减轻企业负担
  • 国防部就美军“压力测试”大演习答澎湃:中国从来不信邪,不怕打,不怕压
  • 中美正在就关税问题谈判甚至会达成协议?外交部:都是假消息
  • 消费者买国外电话卡使用时无信号,店铺:运营商故障,较少见
  • 北京顺义:做好潮白河大桥事故善后处置,举一反三排查风险