We have an array A of non-negative integers.
For every (contiguous) subarray B = [A[i], A[i+1], ..., A[j]] (with i <= j), we take the bitwise OR of all the elements in B, obtaining a result A[i] | A[i+1] | ... | A[j].
Return the number of possible results. (Results that occur more than once are only counted once in the final answer.)
Example 1:
Input: [0]
Output: 1
Explanation:
There is only one possible result: 0.
Example 2:
Input: [1,1,2]
Output: 3
Explanation:
The possible subarrays are [1], [1], [2], [1, 1], [1, 2], [1, 1, 2].
These yield the results 1, 1, 2, 1, 3, 3.
There are 3 unique values, so the answer is 3.
Example 3:
Input: [1,2,4]
Output: 6
Explanation:
The possible results are 1, 2, 3, 4, 6, and 7.
Note:
- 1 <= A.length <= 50000
- 0 <= A[i] <= 10^9
Solution1:(TLE)
class Solution:
def subarrayBitwiseORs(self, A):
"""
:type A: List[int]
:rtype: int
"""
s = set()
for i in range(len(A)): #start with i
for j in range(i,len(A)): #end with j
res = A[i]
for t in range(i+1,j+1):
res = res | A[t]
s.add(res)
return len(s)
65 / 83 test cases passed.
O(n3)
Solution2:(TLE)
class Solution:
def subarrayBitwiseORs(self, A):
"""
:type A: List[int]
:rtype: int
"""
s = set()
for i in range(len(A)): #start with i
for j in range(i,len(A)): #end with j
subarray = set(A[i:j+1])
res = 0
for t in subarray:
res = res | t
s.add(res)
return len(s)
65 / 83 test cases passed.
a little optimization, remove the same elements in subarray.
O(n3)
Solution3:(TLE)
class Solution:
def subarrayBitwiseORs(self, A):
"""
:type A: List[int]
:rtype: int
"""
s = set()
for i in range(len(A)): #start with i
temp = A[i]
for j in range(i,len(A)): #end with j
temp = temp | A[j]
s.add(temp)
return len(s)
70 / 83 test cases passed.
Similar with prefix sum,still can't work.
O(n2)
Solution4:
class Solution:
def subarrayBitwiseORs(self, A):
"""
:type A: List[int]
:rtype: int
"""
s1 = set()
s1.add(A[0])
res = set(A)
for i in range(1,len(A)):
s2 = set()
for t in s1:
s2.add(t|A[i])
s2.add(A[i])
for t in s2:
res.add(t)
s1 = s2 #保存到i的所有或的结果
return len(res)