Re: [閒聊] 每日leetcode

看板Marginalman作者 (神楽めあ的錢包)時間1年前 (2024/11/17 14:38), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1130/1554 (看更多)
862. Shortest Subarray with Sum at Least K 長度為n的矩陣nums 和一個整數k 請回傳最長的subarray長度 該subarray所有元素的總和>=k 思路: 因為nums會有負數 所以用sliding windows會出問題 有兩個做法 (1) 用最小堆,最小堆裡面放的是[i,sum[i]] 先用sum記錄到j的總和 接著從0~n-1 把最小堆裡面滿足 sum[j] - sum[i]>=k的元素全部pop出來 並且維護answer=min(answer,j-i) 再把[j,sum[j]] push到最小堆裡面 這樣就可以得到答案了 (2) 用prefix sum + dequeue 先建立prefix_sum array dequeue裡面放的是nums的index 接著0~n 把滿足prefix_sum[i]-prefix_sum[dequeue[0]]的元素 從dequeue裡pop出來 並且維護answer=min(answer,i-dequeue[0]) 接著把滿足prefix_sum[i]<=prefix_sum[dequeue[dequeue.length-1]] 從dequeue pop出來 要這麼做是因為在prefix_sum[j] <= prefix_sum[i] (j>i)的情況下 如果有一個k滿足prefix_sum[k]-prefix_sum[i] >= k (k>j>i) 那這個k也一定滿足prefix_sum[k]-prefix_sum[j] >= k 而且k-j < k-i 所以i就不需要了 這樣做到最後就可以得到答案 ------------------------------------- code 是第二種方式 golang code : func shortestSubarray(nums []int, k int) int { n := len(nums) prefixsum := make([]int, n+1) for i := 0; i < n; i++ { prefixsum[i+1] = prefixsum[i] + nums[i] } array, ans := []int{}, n+1 for i := 0; i <= n; i++ { for len(array) > 0 && prefixsum[i] <= prefixsum[array[len(array)-1]] { array = array[:len(array)-1] } for len(array) > 0 && prefixsum[i]-prefixsum[array[0]] >= k { ans = min(ans, i-array[0]) array = array[1:] } array = append(array, i) } if ans > n { return -1 } return ans } func min(a, b int) int { if a < b { return a } return b } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 42.73.70.178 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1731825534.A.6CD.html
文章代碼(AID): #1dEOz-RD (Marginalman)
討論串 (同標題文章)
文章代碼(AID): #1dEOz-RD (Marginalman)