bit-op我真的是肏== 真的想去黑暗一趟了
一个方法是sliding window
maintain window内各bit位置的one-count
从后面做回来
每次loop缩window,当缩到idx会让某bit位置的one-count==0,则r=idx+1
window的大小就是那个位置的最小subarr长度了
另一个方法是记下各bit位置上次出现1的idx
一样从后面做回来
nums[i]^target后,等于1的bit位置就是需要从nums[i]以后去取1的位置
遍历这些bit位置,找出上次出现1最远的位置,就会是最小subarr的右端了
def smallestSubarrays(self, nums: List[int]) -> List[int]:
target = 0
rets = [-1 for _ in range(len(nums))]
bit_mem = [999999 for _ in range(32)]
for i in range(len(nums)-1, -1, -1):
target = target | nums[i]
tmp = target ^ nums[i]
j = 0
cur_len = 1
while tmp>0:
if tmp&1==1:
cur_len = max(cur_len, bit_mem[j]-i+1)
tmp = tmp>>1
j += 1
rets[i] = cur_len
tmp = nums[i]
j = 0
while tmp>0:
if tmp&1==1:
bit_mem[j]=min(bit_mem[j], i)
j += 1
tmp = tmp>>1
return rets