【刷题日记】2044. 统计按位或能得到最大值的子集数目

简介: 本次刷题日记的第 8 篇,力扣题为:2044. 统计按位或能得到最大值的子集数目 ,中等

【刷题日记】2044. 统计按位或能得到最大值的子集数目

本次刷题日记的第 8 篇,力扣题为:2044. 统计按位或能得到最大值的子集数目中等

一、题目描述:

image.png

看题一遍好像没有怎么看明白这题到底想干啥,输入的数组和返回值有啥关系?看了示例也有点蒙圈


然后再回头仔细查看最初题目的第一句话,就能明白到底是在说什么了

image.png

不知道 xdm 有没有这种感受 !!!

二、思路分析:

1、这道题考察了什么思想?你的思路是什么?

那么我们仔细来看看,这个题到底是需要我们做些什么呢?我们一步一步的来拆解一下:

  • 题目中会给出一个数组,我们需要找到这个数组的子数组,是非空的子数组
  • 计算每一个子数组元素的按位或的结果,并且找到这些结果中,结果数据最大的子数组有几个

image.png

我们可以看到,做这个题,其实我们就是要明确有这样的包含关系,我们需要的是最里面的的按位或结果最大的子数组

我们可以使用题目中的示例来推演一下:以 nums = [3,2,1,5] 为例

image.png

通过上图,我们就可以将数组的子数组,转成使用 bit 位的方式来进行处理,数组长度为 4, 我们就用 4 个 bit 位来进行表示,bit 位对应位置为 1 ,表示 nums 数组对应位置的数字被选

如果 bit 位对应位置为 0,则表示 nums 数组对应位置的数字没有选中

这个时候,我可以按照子数组中 bit 为 1 的位置对应数组中的数字,作为一个集合,总共 2 的 n 次方 -1 个集合,每个集合计算按位或的结果,最终筛选出按位或最大的值的子数组个数即可

2、尝试编码

根据上述逻辑和分析,我们就可以翻译成如下代码

编码如下:

func countMaxOrSubsets(nums []int) int {
    maxOr := 0
    or := 0
    res := 0
    for i := 1; i< 1 << len(nums); i++ {
         or = 0
         for j,num := range nums {
            if (i >> j) & 1 == 1 {
                 or = or | num
             } 
         }
         if or > maxOr {
             maxOr = or
             res = 1
         }else if or == maxOr {
            res++
         }else{}
    }
    return res
}
  • maxOr 为记录最大的值,当该值被刷新的时候,结果集重新更新为 1
  • or 表示当前集合的按位或结果
  • res 表示按位或最大值的集合个数
  • 编码中的第一个 for 循环表示 ,轮询集合的个数
  • 第二个 for 循环,表示轮询 nums 数组中的元素,找出本次集合 bit 位 为 1 的元素,并计算 按位或 的结果

四、总结:

本题的时间复杂度会相对较高,因为每一次都需要去遍历数组的长度,时间复杂度是:

O(2n∗n)O(2^n*n)O(2nn)

空间复杂度是数组的长度 O(n)

原题地址:2044. 统计按位或能得到最大值的子集数目

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

image.png

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

相关文章
|
机器学习/深度学习 人工智能 自然语言处理
从前端智能化看“低代码/无代码”
什么是低代码/无代码开发?业界对于低代码/无代码开发是否存在其他不同的理解?低代码开发和无代码开发之间的区别是什么?
从前端智能化看“低代码/无代码”
|
12月前
|
Java
java数据结构,双向链表的实现
文章介绍了双向链表的实现,包括数据结构定义、插入和删除操作的代码实现,以及双向链表的其他操作方法,并提供了完整的Java代码实现。
java数据结构,双向链表的实现
|
10月前
|
人工智能 小程序
【一步步开发AI运动小程序】七、进行运动计时、计数
随着AI技术的发展,阿里体育推出的“乐动力”、“天天跳绳”等APP,使云上运动会、AI体育指导等概念备受关注。本文将引导您从零开始,利用“云智AI运动识别小程序插件”,在小程序中实现类似功能。通过插件的`sports`和`calc`命名空间,可轻松实现运动检测、计时计数等功能。示例代码展示了如何创建并使用俯卧撑运动分析器,以及如何通过摄像头捕获图像进行人体识别和运动分析。敬请期待后续关于姿态分析的内容。
|
JavaScript 前端开发
vue常见报错解决方案 | javascript heap out of memory
vue常见报错解决方案 | javascript heap out of memory
1105 0
|
前端开发 数据可视化 Java
OneCode 低代码引擎元数据设计
前言: 在百度百科中,元数据被定义为:描述数据的数据,对数据及信息资源的描述性信息。在低代码平台中元数据的使用也是非常广泛,从前端可视化的组件的prop 属性定义,后端OR Maping数据库表映射,以及支撑系统模块关联关系,权限分配支撑等等都是基础性的元数据。而对于低代码平台及工具而言,其最主要的一个功能也是配置管理低代码组件的元数据信息。在业务组件发生需求变更时尽量通过修改元数配置的方式来改变组件的业务特性。
|
存储 分布式计算 调度
Spark任务调度与数据本地性
Spark任务调度与数据本地性
|
C++ 容器
项目案例一:基于C++的图书馆管理系统
项目案例一:基于C++的图书馆管理系统
476 0
|
XML 开发框架 监控
面试题:springboot比spring有哪些优点?
面试题:springboot比spring有哪些优点?
379 0
|
数据安全/隐私保护 Windows
初次汇编语言编写程序输出HELLO,WORLD!
初次汇编语言编写程序输出HELLO,WORLD!
337 0
初次汇编语言编写程序输出HELLO,WORLD!
|
存储 移动开发 JavaScript
使用vue互联QQ音乐完成网站音乐播放器
记录使用APlayer播放器+MetingJs实现 在线播放qq音乐、网易云音...等平台的音乐
732 1
使用vue互联QQ音乐完成网站音乐播放器