Re: [閒聊] 每日leetcode

看板Marginalman作者 (通通打死)時間18小時前 (2025/12/07 20:41), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1549/1549 (看更多)
這題我寫的好坎坷 我完全忘記這些東西 我吐了 def countPartitions(self, nums: List[int], k: int) -> int: mod = 10**9+7 # O(N^2) # @cache # def backtrack(idx): # if idx>=len(nums): # return 1 # mini = maxi = nums[idx] # count = 0 # for i in range(idx, len(nums)): # mini = min(mini, nums[i]) # maxi = max(maxi, nums[i]) # if (maxi-mini)>k: # break # count = (count+backtrack(i+1)) % mod # return count # find right_max_i n = len(nums) min_q = deque([0]) # by indx to handle duplicate number max_q = deque([0]) # by indx to handle duplicate number right_most_i = [n]*n l = 0 for i in range(1,n): # [l, i] while max_q and nums[i]>=nums[max_q[-1]]: max_q.pop() max_q.append(i) while min_q and nums[i]<=nums[min_q[-1]]: min_q.pop() min_q.append(i) while max_q and min_q: cur_min = nums[min_q[0]] cur_max = nums[max_q[0]] if (cur_max-cur_min) > k: right_most_i[l] = i if max_q[0]==l: max_q.popleft() if min_q[0]==l: min_q.popleft() l += 1 else: break # DP dp = [0]*(n+1) postfix_S = [0]*(n+1) dp[n] = 1 cur_s = 0 for i in range(n-1, -1, -1): dp[i] = ((postfix_S[i+1]-postfix_S[right_most_i[i]]) + dp[right_ most_i[i]]) % mod cur_s = (cur_s + dp[i]) % mod postfix_S[i] = cur_s return dp[0] -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.132.58.28 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1765111305.A.C27.html
文章代碼(AID): #1fDNO9md (Marginalman)
討論串 (同標題文章)
文章代碼(AID): #1fDNO9md (Marginalman)