前往
大廳
主題

LeetCode - 1877. Minimize Maximum Pair Sum in Array 解題心得

Not In My Back Yard | 2021-07-22 00:00:01 | 巴幣 0 | 人氣 470

題目連結:


題目意譯:
數對 (a,b) 的數對和等於 a + b 。最大數對和為數對列表中數對和之值最大的。

例如,如果我們有數對 (1,5) 、 (2,3) 和 (4,4) ,則最大數對和為 max(1+5,2+3,4+4) = max(6,5,8) = 8 。

給定偶數長度 n 的陣列 nums,將其元素們配對成 n ÷ 2 個數對使得
每個 nums 中的元素恰好位於一個數對中,且
最大數對和盡可能地小。

回傳經由最佳地配對元素後所得的最小之最大數對和之值。

限制:
n == nums.length
2 ≦ n ≦ 10 ^ 5
n is even.
1 ≦ nums[i] ≦ 10 ^ 5



範例測資:
範例 1:
輸入: nums = [3,5,2,3]
輸出: 7
解釋: 元素們可以配對成為數對 (3,3) 和 (5,2) 。
最大數對和為 max(3+3, 5+2) = max(6, 7) = 7 。

範例 2:
輸入: nums = [3,5,4,2,4,6]
輸出: 8
解釋: 元素們可以配對成為數對 (3,5) 、 (4,4) 和 (6,2) 。
最大數對和為 max(3+5, 4+4, 6+2) = max(8, 8, 8) = 8 。


解題思維:
基本上跟這題(不過原題已經設為未公開了)一樣——將數字由小到大排序(大到小也可,總之要可以快速存取各種大小的順序),然後將最大與最小配對、次大與次小配對……以此類推。

而這樣便可以使最大數對和盡可能地小。原因如下:
令現在根據排序後所求得最大數對和的數對為 (x,y) ,其中 x ≦ y 。

接著我們假設排序的方法無法得到最佳解,因此存在一數對 (s,t) 與 (x,y) (同樣不失一般性,令 s ≦ t)交換一個元素來使得最大數對和更小:

假設我們是將 s 與 x 項交換,因為要讓原本 (x,y) 的最大總和更小,所以 s 應 ≦ x 而根據利用排序規則時配對(注意,我們還沒交換,所以 (s,t) 仍是排序配對的產物)可得 y ≦ t 。

再假設 s = x - d ,則 t ≦ y + d 。因此 (x,t) 之數對和為 x + t ≦ x + y + d。而因為 s ≦ x 所以 d ≧ 0 ,進而推得 x + y + d ≧ x + y = (x,y) 數對和。

因此 s 與 x 項交換反而可能更糟。同樣地,t 與 y 項交換也會得到類似的結論。

因此原本假設排序配對的方法無法得到最佳解的假說是錯的(得到了矛盾)。根據反證法可證得排序配對為最佳策略(之一)。



值得注意的是,上面的論述不會出現 s 與 y 交換和 t 與 x 交換的情況,因為這樣的配對在以排序配對的前提下不可能出現。例如 s 與 y 交換代表著 x ≦ s ≦ y ≦ t ,但是光看這四個數字便可以知道在排序配對時我們至少應得出 (x,t) 、 (s,y) 而非 (x,y) 、 (s,t) 。




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

創作回應

更多創作