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

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

方法二:回溯

思路

记 n 是数组 nums 的长度。方法一的缺点是,计算不同状态的按位或的值,都需要消耗 O(n) 的时间。这一步部分可以进行优化。每个长度为 n 比特的状态的按位或的值,都是可以在长度为 n−1 比特的状态的按位或的值上计算出来的,而这个计算只需要消耗常数时间。以此类推,边界情况是长度为 0 比特的状态的按位或的值。我们定义一个搜索函数,参数 pos 表示当前下标,orVal 表示当前下标之前的某个子集按位或值,这样就可以保存子集按位或的值的信息,并根据当前元素选择与否更新 orVal 。当搜索到最后位置时,更新最大值和子集个数。

代码

Python3

class Solution: def countMaxOrSubsets(self, nums: List[int]) -> int: maxOr, cnt = 0, 0 def dfs(pos: int, orVal: int) -> None: if pos == len(nums): nonlocal maxOr, cnt if orVal > maxOr: maxOr, cnt = orVal, 1 elif orVal == maxOr: cnt += 1 return dfs(pos + 1, orVal | nums[pos]) dfs(pos + 1, orVal) dfs(0, 0) return cnt

Java

class Solution { int[] nums; int maxOr, cnt; public int countMaxOrSubsets(int[] nums) { this.nums = nums; this.maxOr = 0; this.cnt = 0; dfs(0, 0); return cnt; } public void dfs(int pos, int orVal) { if (pos == nums.length) { if (orVal > maxOr) { maxOr = orVal; cnt = 1; } else if (orVal == maxOr) { cnt++; } return; } dfs(pos + 1, orVal | nums[pos]); dfs(pos + 1, orVal); } }

C#

public class Solution { int[] nums; int maxOr, cnt; public int CountMaxOrSubsets(int[] nums) { this.nums = nums; this.maxOr = 0; this.cnt = 0; DFS(0, 0); return cnt; } public void DFS(int pos, int orVal) { if (pos == nums.Length) { if (orVal > maxOr) { maxOr = orVal; cnt = 1; } else if (orVal == maxOr) { cnt++; } return; } DFS(pos + 1, orVal | nums[pos]); DFS(pos + 1, orVal); } }

C++

class Solution { public: int countMaxOrSubsets(vector<int>& nums) { this->nums = nums; this->maxOr = 0; this->cnt = 0; dfs(0, 0); return cnt; } void dfs(int pos, int orVal) { if (pos == nums.size()) { if (orVal > maxOr) { maxOr = orVal; cnt = 1; } else if (orVal == maxOr) { cnt++; } return; } dfs(pos + 1, orVal| nums[pos]); dfs(pos + 1, orVal); } private: vector<int> nums; int maxOr, cnt; };

C

void dfs(int pos, int orVal, const int* nums, int numsSize, int* maxOr, int* cnt) { if (pos == numsSize) { if (orVal > *maxOr) { *maxOr = orVal; *cnt = 1; } else if (orVal == *maxOr) { (*cnt)++; } return; } dfs(pos + 1, orVal | nums[pos], nums, numsSize, maxOr, cnt); dfs(pos + 1, orVal, nums, numsSize, maxOr, cnt); } int countMaxOrSubsets(int* nums, int numsSize) { int cnt = 0; int maxOr = 0; dfs(0, 0, nums, numsSize, &maxOr, &cnt); return cnt; }

复杂度分析

  • 时间复杂度:O(2n) ,其中 n 是数组 nums 的长度。状态数一共有 O(20 + 21 + ... + 2n) = O(2×2n) = O(2n) 种,每次计算只消耗常数时间。
  • 空间复杂度:O(n) ,其中 n 是数组 nums 的长度。搜索深度最多为 n 。
http://www.jsqmd.com/news/1241217/

相关文章:

  • Appium WebView调试实战:从原理到企业级解决方案
  • AI问卷工具与传统人工设计的效率对比分析
  • Tiva™ TM4C129x EPI总线时序扩展与CRC校验实战指南
  • 2026年专业电力运维服务商推荐:线上监测线下运维全链条解决方案选型指南 - 全域品牌推荐
  • PMI检测X射线荧光光谱仪服务商解析 - 资讯焦点
  • 短视频去水印技术解析与12款工具实测对比
  • 【飞书AI审批合规性加固白皮书】:GDPR/等保2.0双认证下,自动拦截高风险单据的6类规则引擎配置
  • SaaS平台的API网关设计:认证、限流与版本管理的统一架构
  • 监控体系:从“救火队员“到“预言家“
  • LangGraph、LangChain、DeepAgent思考循环解析
  • TI TMS570/AM2x N2HET HWAG模块实战:从寄存器配置到电机控制应用
  • 深入解析Tiva C系列ADC采样序列与数字比较器高级配置
  • BLIP与BLIP-2多模态模型实战:从原理到应用
  • 2026年天然气在线实流检定装置厂家实力推荐:精准计量与稳定可靠技术领先之选 - 甄选服务推荐
  • 绵阳毛坯新房装修怎么选?千川环宇给出解法 - 资讯焦点
  • RAG与文生图技术融合:企业级应用实战与避坑指南
  • n8n核心节点实战:HTTPRequest、Webhook、SMTP与MySQL配置指南
  • STM32农业物联网系统:智能监控与精准灌溉实践
  • 2026年7月上海GEO服务商测评:综合服务能力与落地效果全面盘点
  • 碳化硅功率器件在快充市场的技术突破与应用
  • 深入解析Cortex-M4 JTAG/SWD调试:从TAP状态机到FPU调试实战
  • 容量规划:让系统“未雨绸缪“
  • 大模型Tool Calling技术:从原理到实战应用
  • 2026年污水站废气除臭低运维成本品牌推荐与选择指南 - 全域品牌推荐
  • Termux安卓终端环境配置与开发指南
  • DDR控制器寄存器配置实战:从时序计算到稳定性调优
  • 新疆旅行社接待境外游客,4 项语种配套服务是否不可或缺? - 优企甄选
  • 【SkyWalking从入门到精通】第63篇:监控SkyWalking本身——别让你的APM成为盲点
  • Vision Transformer编码流程及代码详解
  • 基于TI HVDMC套件的无传感器FOC电机控制:从硬件配置到六级增量构建实战