LeetCode 2044. 统计按位或能得到最大值的子集数目
LeetCode 每日一题 2025/07/28 – 统计按位或能得到最大值的子集数目
问题描述
给你一个整数数组 nums
,找出所有非空子集(subset)的按位或(bitwise OR)能得到的最大值,并返回按位或能得到最大值的 不同非空子集 的 个数。
- 子集的定义:如果数组
a
可以由数组b
删除若干元素(或不删除)得到,则a
是b
的一个子集。 - 如果选中的元素下标位置不一样,则认为两个子集不同。
- 子集的按位或:
a[0] OR a[1] OR ... OR a[a.length - 1]
。
解法一:动态规划
数学描述
设数组为
即从前
最终答案即为
初始条件
状态转移
对于每个
不选
,子集 OR 保持不变:选
,若之前 OR 值为 ,则新 OR 值为 :
合并得转移方程:
最终结果
遍历完所有
代码
1 | class Solution: |
复杂度分析
- 时间复杂度:
,其中 是数组nums
的长度。总次数是 ,即 。 - 空间复杂度:O(K),其中
是dp
中不同按位或结果的数量。
解法二:DFS + 剪枝
DFS递归表示是否选择第
1 | class Solution: |
复杂度分析
- 时间复杂度:
,其中 是数组nums
的长度。本质上枚举了所有子集,子集数量一共有 种,每次计算只消耗常数时间。 - 空间复杂度:
,其中 是数组nums
的长度。DFS搜索深度最多为 。
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.