前往
大廳
主題

LeetCode - 2567. Minimum Score by Changing Two Elements 解題心得

Not In My Back Yard | 2024-01-19 12:00:05 | 巴幣 0 | 人氣 57

題目連結:


題目意譯:
你被給定一個索引值從 0 開始的整數陣列 nums。

nums 的 low 分數為對於所有 0 ≦ i < j < nums.length,|nums[i] - nums[j]| 之最小值。

nums 的 high 分數為對於所有 0 ≦ i < j < nums.length,|nums[i] - nums[j]| 之最大值。

nums 的分數為 nums 的 low 分數和 high 分數之總和。

為了最小化 nums 的分數,我們可以更改 nums 中最多兩個元素之值。

回傳在更動 nums 中最多兩個元素值的情況下,最小可能的分數值。

注意到 |x| 代表著 x 的絕對值。

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



範例測資:
範例 1:
輸入: nums = [1,4,3]
輸出: 0
解釋: 將 nums[1] 和 nums[2] 變成 1,使得 nums 變成 [1,1,1]。現在 |nums[i] - nums[j]| 的數值必定為 0,所以我們回傳 0 - 0 = 0。

範例 2:
輸入: nums = [1,4,7,8,5]
輸出: 3
解釋: 將 nums[1] 和 nums[2] 變成 6。現在 nums 變成了 [6,6,7,8,5]。
現在的 low 分數出現於 i = 0 且 j = 1 的時候,此時 |nums[i] - nums[j]| = |6 - 6| = 0。
現在的 high 分數出現於 i = 3 且 j = 4 的時候,此時 |nums[i] - nums[j]| = |8 - 5| = 3。
low 分數和 high 分數之總和為 3。可以證明此值為最小可能的分數。


解題思維:
先將 nums 中的數字由小排到大,可以看到 low 分數和 high 分數都不會變。前者將會是排序後兩兩數字差值之最小值、後者將會是排序的 nums[nums.length - 1] - nums[0]。

而我們在更改元素值後必定可以將 low 分數降至 0(如果原本不是 0 的話),即把某個數字變得跟其他某個數字一樣。而為了最小化 high 分數,我們會有三個策略:
一:將最大值變小並將最小值變大,即將 nums[nums.length - 1] 變為 nums[nums.length - 2] 、 nums[0] 變成 nums[1]。而此時的 low 分數為 0 、 high 分數為 nums[nums.length - 2] - nums[1]、

二:將兩個最大值變小,即將 nums[nums.length - 1] 和 nums[nums.length - 2] 都變成 nums[nums.length - 3]。而此時的 low 分數為 0 、 high 分數為 nums[nums.length - 3] - nums[0]、

三:將兩個最小值變大,即將 nums[0] 和 nums[1] 都變成 nums[2]。而此時的 low 分數為 0 、 high 分數為 nums[nums.length - 1] - nums[2]。

為何只有這三個策略?因為如果改變其他值,雖然可能 low 分數降至 0 但是 high 分數就會保持不變。而由於三個策略都有可能是最佳的,因此三種都各自算出來求最佳即可。




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

創作回應

更多創作