前往
大廳
主題

LeetCode - 561. Array Partition I 解題心得

Not In My Back Yard | 2020-11-18 20:55:54 | 巴幣 2 | 人氣 546

題目連結:


題目意譯:
給定一個有 2n 個整數之整數陣列,將這些數字配成 n 對 (a1, b1) 、 (a2, b2) 、 …… 、 (an, bn) ,滿足對於所有 i 值之 min(ai, bi) 之總和為最大。輸出該最大總和之值。

限制:
1 ≦ n ≦ 10 ^ 4
nums.length == 2 × n
-10 ^ 4 ≦ nums[i] ≦ 10 ^ 4



範例測資:
範例 1:
輸入: nums = [1,4,3,2]
輸出: 4
解釋: 所有可能的配對(忽略元素的排列順序)為:
1. (1, 4), (2, 3) → min(1, 4) + min(2, 3) = 1 + 2 = 3
2. (1, 3), (2, 4) → min(1, 3) + min(2, 4) = 1 + 2 = 3
3. (1, 2), (3, 4) → min(1, 2) + min(3, 4) = 1 + 3 = 4
所以最大可能的總和為 4。

範例 2:
輸入: nums = [6,2,6,5,1,2]
輸出: 9
解釋: 最佳配對為 (2, 1) 、 (2, 5) 、 (6, 6)。 min(2, 1) + min(2, 5) + min(6, 6) = 1 + 2 + 6 = 9。


解題思維:
我們先將原本的數列由小到大排序後,並編號為 X1 、 X2 、 …… 、 X2n-1 、 X2n

則我們立即找到一個且唯一一個配對組合 (X1, X2) 、 (X3, X4) 、 …… 、 (X2n-1, X2n) 使得每對的最小值之總和最大。



以下是證明該配對為最佳解:
假設 S = X1 + X2 + …… + X2n ,且假設對於某個組合我們有 D = (b1 - a1) + (b2 - a2) + …… + (bn - an) 之值,其中 ai ≦ bi、而所求 W 為 a1 + a2 + …… + an

可以看到 S 顯然為一定值且等於 2W + D (2(a1 + a2 + …… + an) + [(b1 - a1) + (b2 - a2) + …… + (bn - an)] = a1 + a2 + …… + an + b1 + b2 + …… + bn)。

因此我們如果要最大化所求的 W 之值,則 D 就要盡可能地小。而 D 越小代表著的是每對數字的差值要越小,而最小的情況就發生在 (X1, X2) 、 (X3, X4) 、 …… 、 (X2n-1, X2n),因此該組合會得到最大的 W 值,即所求。




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

創作回應

更多創作