我们有一个非负整数数组 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 <= A.length <= 50000
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)。