Re: [闲聊] 每日leetcode

楼主: DJYOMIYAHINA (通通打死)   2025-07-29 23:16:03
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
作者: karin1104 (阿宗)   2024-07-29 23:16:00
你是大师
楼主: DJYOMIYAHINA (通通打死)   2025-07-29 23:17:00
其实先更新bit_mem,就也不用做xor了,比较直观

Links booklink

Contact Us: admin [ a t ] ucptt.com