ETH官方钱包

前往
大廳
主題

LeetCode - 1509. Minimum Difference Between Largest and Smallest Value in Three Moves 解題心得

Not In My Back Yard | 2024-08-08 12:00:04 | 巴幣 0 | 人氣 39

題目連結:


題目意譯:
你被給定一個整數陣列 nums。

在一步之中,你可以選擇 nums 中的某一個元素並改變其值。

回傳經過最多三步之後,nums 中最小值與最大值之差值最小可以為何。

限制:
1 ≦ nums.length ≦ 10 ^ 5
-10 ^ 9 ≦ nums[i] ≦ 10 ^ 9



範例測資:
範例 1:
輸入: nums = [5,3,2,4]
輸出: 0
解釋: 我們最多可以做 3 步。
在第一步中,將 2 變成 3。nums 變為 [5,3,3,4]。
在第二步中,將 4 變成 3。nums 變為 [5,3,3,3]。
在第三步中,將 5 變成 3。nums 變為 [3,3,3,3]。
在執行 3 步之後,最小值與最大值的差值為 3 - 3 = 0。

範例 2:
輸入: nums = [1,5,0,10,14]
輸出: 1
解釋: 我們最多可以做 3 步。
在第一步中,將 5 變成 0。nums 變為 [1,0,0,10,14]。
在第二步中,將 10 變成 0。nums 變為 [1,0,0,0,14]。
在第三步中,將 14 變成 1。nums 變為 [1,0,0,0,1]。
在執行 3 步之後,最小值與最大值的差值為 1 - 0 = 1。
可以證明在 3 步內將差值變成 0 是不可能的。

範例 3:
輸入: nums = [3,100,20]
輸出: 0
解釋: 我們最多可以做 3 步。
在第一步中,將 100 變成 7。nums 變為 [3,7,20]。
在第二步中,將 20 變成 7。nums 變為 [3,7,7]。
在第三步中,將 3 變成 7。nums 變為 [7,7,7]。
在執行 3 步之後,最小值與最大值的差值為 7 - 7 = 0。


解題思維:
首先,我們可以看到如果 nums 的長度小於等於 4,則我們必定可以把所有數字變得一模一樣。因此最小差值將會是 0。

反之,如果 nums 的長度大於 4,則我們可以有四種最佳的選項來改變 nums 中的數字:
    一,將最小的三個數字變為其餘(不會被改變)的數字;
    二,將最小的兩個數字和最大的數字變為其餘的數字;
    三,將最小的數字和最大的兩個數字變為其餘的數字;
    四,將最大的三個數字變為其餘的數字;

可以看到最佳策略只有以上四種。因為如果不按照以上這些策略,會損失至少一次將最大差值變小的機會或是因為前面改的數字不夠「中間」而浪費至少一次變小的機會(簡單來說是如此,但正式證明會需要以反證法證明。由於這部份寫起來會很長,故省略)。

因此我們可以將 nums 先排序(以便快速存取最小和最大的三個數字),然後檢查哪個策略會得到最小的差值即為所求。




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

創作回應

更多創作