LeetCode 898. Bitwise ORs of Subarrays
Desc:
有一个非负整数数组a,对所有整数对(i,j)求 a[i]|a[i+1]|a[i+2]…a[j] 的值(|为按位或),求共有多少个不相等的值
$$
1\le a.length() \le 5000
$$
$$
0 \le a[i] \le 10^9
$$
My_Ans:
n^2裸题 冲冲冲
设b(i,j)=a[i]|a[i+1]….|a[j] 用一个set now保存b(0,i),b(1,i),b(2,i)
然后每次处理到a[i+1]的时候 把now里的所有项和a[i+1] 按位或一下
然后把a[i+1]添加到now里
但是这个范围好像给我喂了一口X….
仔细分析 10^9 那好像最多也不会有很多数啊
按位或的特性就是一旦有了1就不会再变成0了…
那也就是说最坏的情况下now这个集合里只会有30个不同的值
但是这个过程中我们会遇到一个巨大的数据结构常数 即set去重和插入的时间
大概复杂度是
$$
log(10^9)N=30N
$$
然后 然后我冲了 (反正leetcode 复杂度这么宽
莽夫是这样的
UPD: 再思考一下你会发现b(i,j)可以从b(i+1,j)推出来可以少一个set now 貌似能跑更快
Code:
1 | class Solution { |
1 | class Solution { |