Re: [閒聊] 每日leetcode

看板Marginalman作者 (神楽めあ的錢包)時間1年前 (2024/11/23 18:26), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1148/1548 (看更多)
3355. Zero Array Transformation I 思路: 用difference 矩陣 difference矩陣在你要對矩陣的1個區域加上相同的值很好用 假設要對[L,R]間的數加上5,那就將difference[L]+5、difference[R+1]-5 將difference矩陣進行prefix sum就可以得到進行相加後的矩陣了 e.g. 假設有一個 [1,3,4,6,10]他的difference矩陣就是[1,2,1,2,4] 要對[1,3]間的數加上4,就會變成[1,6,1,2,0] 最後對difference矩陣進行prefix sum 會變成 [1,7,8,10,10] 可以看出就是原本矩陣[1,3]區間加上4 這題其實就是要對一個長度n且元素都為0的矩陣 : array 按照queries相對應的區間依序加上1 最後看array[i]>=nums[i] 所有i都成立就可以達到題目要求 golang code : func isZeroArray(nums []int, queries [][]int) bool { diff := make([]int, len(nums)+1) for _, val := range queries { diff[val[0]]++ diff[val[1]+1]-- } if nums[0] > diff[0] { return false } for i := 1; i < len(nums); i++ { diff[i] += diff[i-1] if diff[i] < nums[i] { return false } } return true } 3356. Zero Array Transformation II 思路: 用上一題的方式 + 二分搜尋法 要特別注意邊界條件 (1)不用任何queries的情況(nums所有元素都是0) 我是直接去檢查來看是不是所有元素都是0 (2)就算用了所有queries也沒辦法達到要求 我在queries最後面增加了[]int{0, n - 1, 1e6} 這樣 r+1 == len(queries) 就是無法達成題目所需,回傳-1 golang code : func minZeroArray(nums []int, queries [][]int) int { l, r, n := 0, len(queries), len(nums) queries = append(queries, []int{0, n - 1, 1e6}) array, prev_m := make([]int, n+1), -1 sum := 0 for i := 0; i < n; i++ { sum += nums[i] } if sum == 0 { return 0 } for r > l { m := l + (r-l)/2 if m > prev_m { for i := prev_m + 1; i <= m; i++ { array[queries[i][0]] += queries[i][2] array[queries[i][1]+1] -= queries[i][2] } } else { for i := prev_m; i > m; i-- { array[queries[i][0]] -= queries[i][2] array[queries[i][1]+1] += queries[i][2] } } prev_m = m tmp := 0 canBeZero := true for i := 0; i < n; i++ { tmp += array[i] if tmp < nums[i] { canBeZero = false break } } if canBeZero { r = m } else { l = m + 1 } } r++ if r == len(queries) { return -1 } return r } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.71.214.73 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1732357580.A.731.html
文章代碼(AID): #1dGQtCSn (Marginalman)
討論串 (同標題文章)
文章代碼(AID): #1dGQtCSn (Marginalman)