我們有乙個非負整數陣列 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
最有方法的思路:
中間那一列儲存的是:第乙個set儲存的是到目前為止的或的結果,第二個set儲存的是我前面的那個元素
然後見盡力啊新的元素的時候,我就用心的元素去或上這兩個set,然後加上自己本身,就是結果。因為自己本身或就是自己本身
也是動態規劃的思想。
顯示以1結尾的,只有1
然後2進來,或上1 得3 並加上自己本身
這是一種空間換時間的做法,乙個cur集合儲存上一次迴圈的位或結果集合,將這些集合和當前迴圈的元素進行位或運算,在補充上當前元素。然後乙個res和cur取並集。
為什麼要有乙個cur而不直接用res呢?或者為什麼要用兩個集合而不是乙個集合呢?
考慮[1,2,4]這個測試用例:
第一輪迴圈時,a=1,cur=,res=
第二輪迴圈時,a=2,cur = | = , res=
第三輪迴圈時,a=4,cur=| = ,res=
那麼顯然直接返回cur的長度是不可能的,直接返回cur和原始輸入a的並集也是不可以的,因為漏掉了3。對於我能考慮到替換res的兩種方法,都會導致測試不通過,所以res這個集合的存在是有必要的。
# 連續子陣列按位或操作 leetcode-898
#方法一
defsubarraybitwiseors
(a: list[
int])-
>
int:
n =len(a)
s =for i in
range(0
, n)
: temp = a[i]
s.add(temp)
for j in
range
(i+1
, n)
: temp |
= a[j]
s.add(temp)
return
len(s)
# 方法二 因為set每次都會判斷是否有重複的值 慢 換成列表
deflianxv_002
(a: list[
int])-
>
int:
n =len(a)
s =for i in
range(0
, n)
: temp = a[i]
for j in
range
(i+1
, n)
: temp |
= a[j]
return
len(
set(s)
)#方法三:動態規劃的思想
deflianxv_003
(a:list[
int])-
>
int:
cur =
set(
) res =
set(
)for a in a:
# a 是要新進來的元素
cur =
| res |
= cur # cur和res取得並集
return
len(res)
LeetCode 按奇偶排序陣列
給定乙個非負整數陣列a,返回乙個由a的所有偶數元素組成的陣列,後面跟a的所有奇數元素。你可以返回滿足此條件的任何陣列作為答案。示例 輸入 3,1,2,4 輸出 2,4,3,1 輸出 4,2,3,1 2,4,1,3 和 4,2,1,3 也會被接受。1 a.length 50000 a i 5000cl...
Leetcode 按奇偶排序陣列
給定乙個非負整數陣列a,返回乙個由a的所有偶數元素組成的陣列,後面跟a的所有奇數元素。你可以返回滿足此條件的任何陣列作為答案。示例 輸入 3,1,2,4 輸出 2,4,3,1 輸出 4,2,3,1 2,4,1,3 和 4,2,1,3 也會被接受。1 a.length 50000 a i 5000in...
78 子陣列按位或操作
題目描述 我們有乙個非負整數陣列 a。對於每個 連續的 子陣列 b a i a i 1 a j i j 我們對 b 中的每個元素進行按位或操作,獲得結果 a i a i 1 a j 返回可能結果的數量。多次出現的結果在最終答案中僅計算一次。示例 1 輸入 0 輸出 1 解釋 只有乙個可能的結果 0 ...