或运算
或运算:
- 二进制进行或运算,只有有一个 1,则结果为 1
- 多个数字进行或运算
例题 - 按位或最大的最小子数组长度
py
class Solution:
def smallestSubarrays(self, nums: List[int]) -> List[int]:
ans = [1] * len(nums)
maxOR = []
for i, x in enumerate(nums):
maxOR.append(x)
for j in range(i-1, -1, -1):
"""
由于 i 是从左到右,所以当 maxOR[j] | x 的结果等于 maxOR[j] 后,
则说明再往前找,也找不到比 maxOR[j] 更大的了
因为 maxOR[j] 表示的是 nums[0..j] 的最大或值。
多个数字的或运算,意味着某一位上一旦有一个 1,那么这个位上就只会是 1 了
也就是说,或运算的结果,要么保存不变,要么增加了值为 1 的位的数量。
所以当 a | b = a 时,类似于 b 是 a 的子集,
因为 b 二进制上有 1 的位,在 a 上都有
"""
if maxOR[j] | x == maxOR[j]:
break
maxOR[j] |= x
ans[j] = i - j + 1
return ans