前往
大廳
主題

LeetCode - 2439. Minimize Maximum of Array 解題心得

Not In My Back Yard | 2023-09-03 12:00:11 | 巴幣 0 | 人氣 96

題目連結:


題目意譯:
你被給定一個索引值從 0 開始的陣列 nums,其由 n 個非負整數所組成。

在一次操作中,你必須:
選擇一整數 i,使得 1 ≦ i < n 且 nums[i] > 0、
將 nums[i] 減 1、
將 nums[i - 1] 加 1、

回傳在執行任意次的操作後可以得到的 nums 中的最大值之最小可能值。

限制:
n == nums.length
2 ≦ n ≦ 10 ^ 5
0 ≦ nums[i] ≦ 10 ^ 9



範例測資:
範例 1:
輸入: nums = [3,7,1,6]
輸出: 5
解釋:
一組最佳操作為以下:
1. 選擇 i = 1,nums 變成 [4,6,1,6]。
2. 選擇 i = 3,nums 變成 [4,6,2,5]。
3. 選擇 i = 1,nums 變成 [5,5,2,5]。
nums 中的最大值為 5。可以證明最大值無法小於 5。
因此,我們回傳 5。

範例 2:
輸入: nums = [10,1]
輸出: 10
解釋:
最佳作法是保持 nums 不變,由於 10 為其最大值,我們回傳 10。


解題思維:
對答案本身進行二分搜尋法(Binary Search)即可,如這題

要怎麼檢查一個值 M 可不可行?從 nums 的結尾往回掃,然後對每個 nums[i] 檢查是否大過 M,如果有則我們將執行 nums[i] - M 次操作,把多出的部分(即 nums[i] - M)轉移到 nums[i - 1](當然前提是 i > 0)。最後掃完之後檢查 nums[0] 有沒有超過 M。如果有則代表我們猜的 M 值太小了,要猜大一點;反之,則「可能」可以再猜小一點。

剩下的就跟一般的二分搜尋法一致,最後上述過程停下的部分即為所求。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作