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

统计按位或能得到最大值的子集数目(二)

接上文,小编来分享解题思路:

解决方案

方法一:位运算

记 n 是数组 nums 的长度,数组中的每个元素都可以选取或者不选取,因此数组的非空子集数目一共有 (2n-1) 个。可以用一个长度为 n 比特的整数来表示不同的子集,在整数的二进制表示中,n 个比特的值代表了对数组不同元素的取舍。第 i 位值为 1 则表示该子集选取对应元素,第 i 位值为 0 则表示该子集不选取对应元素。求出每个子集的按位或的值,并计算取到最大值时的子集个数。

代码

Python3

class Solution: def countMaxOrSubsets(self, nums: List[int]) -> int: maxOr, cnt = 0, 0 for i in range(1, 1 << len(nums)): orVal = reduce(or_, (num for j, num in enumerate(nums) if (i >> j) & 1), 0) if orVal > maxOr: maxOr, cnt = orVal, 1 elif orVal == maxOr: cnt += 1 return cnt

Java

class Solution { public int countMaxOrSubsets(int[] nums) { int maxOr = 0, cnt = 0; for (int i = 0; i < 1 << nums.length; i++) { int orVal = 0; for (int j = 0; j < nums.length; j++) { if (((i >> j) & 1) == 1) { orVal |= nums[j]; } } if (orVal > maxOr) { maxOr = orVal; cnt = 1; } else if (orVal == maxOr) { cnt++; } } return cnt; } }

C#

public class Solution { public int CountMaxOrSubsets(int[] nums) { int maxOr = 0, cnt = 0; for (int i = 0; i < 1 << nums.Length; i++) { int orVal = 0; for (int j = 0; j < nums.Length; j++) { if (((i >> j) & 1) == 1) { orVal |= nums[j]; } } if (orVal > maxOr) { maxOr = orVal; cnt = 1; } else if (orVal == maxOr) { cnt++; } } return cnt; } }

C++

class Solution { public: int countMaxOrSubsets(vector<int>& nums) { int n = nums.size(), maxValue = 0, cnt = 0, stateNumber = 1 << n; for (int i = 0; i < stateNumber; i++) { int cur = 0; for (int j = 0; j < n; j++) { if (((i >> j) & 1) == 1) { cur |= nums[j]; } } if (cur == maxValue) { cnt++; } else if (cur > maxValue) { maxValue = cur; cnt = 1; } } return cnt; } };

复杂度分析

时间复杂度:O(2n×n) ,其中 n 是数组 nums 的长度。需要遍历 O(2n) 个状态,遍历每个状态时需要遍历 O(n) 位。

空间复杂度:O(1) 。仅使用常量空间。

http://www.cnnetsun.cn/news/3565654.html

相关文章:

  • Chanlun-Pro缠论量化分析:从复杂理论到智能交易的终极解决方案
  • 【IEEE出版、EI检索】2026年数据与信息系统国际学术会议(DIS 2026)
  • RSpotify性能优化:提升Rust音乐应用的响应速度
  • MagiskBoot深度解析:Android系统定制与Root权限实战指南
  • GitHub功能大揭秘:AI代码创作、开发者工作流等一应俱全!
  • 为什么选择DataSourceKit?5大理由让你的iOS表格视图开发效率提升3倍
  • AP-0316 全功能 DSP 语音模组硬核技术解析
  • UNICORN Binance WebSocket API异步编程指南:asyncio与回调函数最佳实践
  • Comic Backup:你的数字漫画永久保存终极指南
  • NUXTOR快速入门:10分钟内创建你的第一个桌面应用
  • # C++ 中的 `string_view` 和 `span`:现代安全视图指南
  • Outlook添加多个邮箱:账户与共享邮箱
  • 计算机毕业设计之影视推荐系统
  • NUXTOR与NuxtUI 4的完美结合:打造现代化桌面应用界面
  • eDBG实战教程:利用MCP模式赋予AI强大的动态分析能力
  • Resend邮件轰炸投毒(Reputation Poisoning)解决方案
  • AI模型安全审查能力失效的5个致命盲区(2024黑产实测数据曝光:83%大模型在第4轮对抗测试中崩溃)
  • StockAnal_Sys开发指南:如何扩展自定义分析指标与数据源
  • 第24讲:Vibe模式代码风格控制——适配Keil/STM32工程规范
  • 实战破解:从零构建Lean 4开发环境的完整解决方案
  • 【A/B测试验证】:用LLM+CV双模态干预,将AI短视频完播率从29%拉升至63.4%的72小时实操路径
  • HttpClient 发送请求封装
  • 内存泄漏系列专题分析之五:使用malloc_debug定位C/C++ native heap内存泄露
  • Reducer 是什么?多个节点如何安全更新状态
  • OpenZFS内核模块编译与调试:深入理解文件系统架构的终极指南 [特殊字符]
  • 【亲测免费】 picacomic-downloader:快速下载哔咔漫画的利器
  • Apache Airflow 3.0完整指南:5分钟构建企业级数据工作流自动化系统
  • 通义千问CLI终极指南:从命令行到智能代理的技术深度解析
  • 打造个性化轮播:使用LESS自定义jQuery.Flipster主题的完整教程
  • 5分钟快速入门DeepXDE:科学机器学习与物理信息学习的终极指南