📅  最后修改于: 2023-12-03 14:55:34.052000             🧑  作者: Mango
给定一个含有多个元素的数组,找到所有可能的非空连续子数组,对于每个子数组计算其按位或值,返回结果的所有可能取值。
输入:[1,2,4]
输出:[1,2,3,4,6,7]
一个简单粗暴的解法:两层循环,遍历所有子数组,计算按位或。虽然简单,但无法在限定的时间复杂度内完成。
正确的做法应该是利用位运算的性质,从高位到低位直接计算。具体的实现有点类似于动态规划,扫描整个数组,对于每个元素,用一个变量记录它之前的最大值,然后对这个最大值和当前元素进行按位或运算,并将结果加入结果集中。同时,将当前的最大值与当前元素按位或的结果也加入结果集。
class Solution:
def subarrayBitwiseORs(self, A: List[int]) -> List[int]:
cur, res = set(), set()
for a in A:
cur = {a | b for b in cur} | {a}
res |= cur
return list(res)