Bitwise ORs of Subarrays 子数组按位或操作

本文探讨了在一个非负整数数组中所有连续子数组进行按位或运算后的唯一结果数量问题。通过示例说明了如何计算不同子数组的按位或结果,并介绍了避免重复计算的方法,最终给出了一种高效算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们有一个非负整数数组 A

对于每个(连续的)子数组 B = [A[i], A[i+1], ..., A[j]] ( i <= j),我们对 B 中的每个元素进行按位或操作,获得结果 A[i] | A[i+1] | ... | A[j]

返回可能结果的数量。 (多次出现的结果在最终答案中仅计算一次。)

示例 1:

输入:[0]
输出:1
解释:
只有一个可能的结果 0 。

示例 2:

输入:[1,1,2]
输出:3
解释:
可能的子数组为 [1],[1],[2],[1, 1],[1, 2],[1, 1, 2]。
产生的结果为 1,1,2,1,3,3 。
有三个唯一值,所以答案是 3 。

示例 3:

输入:[1,2,4]
输出:6
解释:
可能的结果是 1,2,3,4,6,以及 7 。

提示:

  1. 1 <= A.length <= 50000
  2. 0 <= A[i] <= 10^9

思路:

比如,我们输入的数组是 [001, 011, 100, 110, 101] (二进制表示).

所有的子数组为:

[001]
[001 011] [011]
[001 011 100] [011 100] [100]
[001 011 100 110] [011 100 110] [100 110] [110]
[001 011 100 110 101] [011 100 110 101] [100 110 101] [110 101] [101]

对于每一行,我们都在上一行的基础上对每个组合加上一个新的数

我们对每个子数组都计算或运算:

001
011 011
111 111 100
111 111 110 110
111 111 111 111 101

一共有O(N^2) 个数字,是无法通过的.

移除每一行的重复数字:

001
011
111 100
111 110
111 101

对每一行 t, 对任意两个数字t[i] 和 t[j] (i < j), t[i] 比 t[j] 包含更多的数字(当然t[i]也包含t[j]),所以t[i] 比 t[j]或操作后会有更多的1. 所以每一行的长度不会超过32. 

时间复杂度为 O(kN), k决定于输入数字的位长. (这道题中等于32)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值