Re: [閒聊] 每日leetcode

看板Marginalman作者 (通通打死)時間4月前 (2025/07/29 23:16), 編輯推噓1(101)
留言2則, 2人參與, 4月前最新討論串1479/1548 (看更多)
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 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.132.58.28 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1753802165.A.396.html

07/29 23:16, 4月前 , 1F
你是大師
07/29 23:16, 1F

07/29 23:17, 4月前 , 2F
其實先更新bit_mem,就也不用做xor了,比較直觀
07/29 23:17, 2F
文章代碼(AID): #1eYEMrEM (Marginalman)
討論串 (同標題文章)
文章代碼(AID): #1eYEMrEM (Marginalman)