最小化pair sum的極大值 Minimize Max Pair Sum in Array_Leetcode 1877

閱讀時間約 5 分鐘

這題的題目在這裡:Minimize Maximum Pair Sum in Array

題目敘述

題目會給我們一個整數陣列nums,裡面都是正整數,而且陣列長度保證是偶數

要求我們倆倆將所有整數配對成一組pair,要求我們最小化pair sum的極大值。

舉例,[1,2,3,4]

最佳解為

1,4 配對,pair sum = 5

2,3 配對,pair sum = 5

回傳答案 最小化pair sum的極大值max(5, 5) = 5

註: 其他配對情況,所產生的最小化pair sum的極大值都比5還大


測試範例

Example 1:

Input: nums = [3,5,2,3]
Output: 7
Explanation: The elements can be paired up into pairs (3,3) and (5,2).
The maximum pair sum is max(3+3, 5+2) = max(6, 7) = 7.

Example 2:

Input: nums = [3,5,4,2,4,6]
Output: 8
Explanation: The elements can be paired up into pairs (3,5), (4,4), and (6,2).
The maximum pair sum is max(3+5, 4+4, 6+2) = max(8, 8, 8) = 8.

約束條件

Constraints:

  • n == nums.length
  • 2 <= n <= 10^5
  • n is even.
  • 1 <= nums[i] <= 10^5

演算法

先用比較小的模型來想

假設只有四個數字,a <= b <= c <= d

那麼最佳配對方法為何?

最佳配對方法是: (a, d) 和 (b, c)

max(a+d, b+c) 會是最終答案


這邊用反證法去證明

假如不這麼配呢?


假如(a, c) 和 (b, d)一組

b + d >= a + d (從兩邊等量相加d得到)

b + d >= b + c (從兩邊等量相加b得到)

max(a+c, b+d) >= b + d >= max(a+d, b+c)

所以不是最佳解


假如(a, b) 和 (c, d)一組

c + d >= a + d (從兩邊等量相加d得到)

c + d >= b + c (從兩邊等量相加c得到)

max(a+b, c+d) >= c + d >= max(a+d, b+c)

所以不是最佳解


其他更多數字的情況,可以用類似的手法去推廣證明。

最後歸納可以發現,最佳解的配對方法,就是

最小的數字最大的數字

第二小的數字第二大的數字

第三小的數字第三大的數字

...

依此類推


所以,先把輸入陣列作排序由小到大升序排列。

接著,從頭尾開始配對,往中心前進,過程中,得到的配對最大值,就是整個陣列元素配對的最小化pair sum的極大值


程式碼

class Solution:
 def minPairSum(self, nums: List[int]) -> int:

  # Keep nums sorted in ascending order
  nums.sort()

  left, right = 0, len(nums)-1
  optimal = 0

  # Keep each pair sum as near as possible
  # one from current smallest, one from current largest
  while left < right:

   cur_pair = nums[left] + nums[right]
   optimal = max(optimal, cur_pair)

   left, right = left+1, right-1

  return optimal
  


複雜度分析

時間複雜度: O(n log n)

陣列排序,耗費O(n log n)

迴圈,線性掃描,耗費O(n)

總時間成本,取大的,最後是O( n log n)


空間複雜度: O(1)

所用到的都是固定尺寸的臨時變數,為常數級別O(1)


關鍵知識點

最後歸納可以發現,最佳解的配對方法,就是

最小的數字最大的數字

第二小的數字第二大的數字

第三小的數字第三大的數字

...

依此類推


所以,先把輸入陣列作排序由小到大升序排列。

接著,從頭尾開始配對,往中心前進,過程中,得到的配對最大值,就是整個陣列元素配對的最小化pair sum的極大值


Reference:

[1] Python O(n log n ) by sorting and two-pointers [w/ Comment] - Minimize Maximum Pair Sum in Array - LeetCode

avatar-img
90會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
這題的題目在這裡:Gray Code 題目敘述 題目會給我們一個bit寬度n,要求我們造出所有格雷編碼。 格雷編碼就是一組二進位編碼,每兩個相鄰的編碼的hamming distance都是1。 如果第一次接觸的讀者,可以參考 Wiki Gray Code
題目會給我們一個字串陣列nums,內容都是二進位字串,要求我們造出一個另一個相等長度,新的二進位字串,而且不和字串陣列nums內的重複。 答案可能有不只一組,回傳合任一組合法的答案皆可。
題目會給我們一個字串s,內容都是由英文小寫字母組成,要求我們計算長度為3的回文子序列有多少個? 舉例,aba者種形式的序列,就是長度為3的回文序列。
題目會給我們一個routes 陣列,裡面都是分別代表每一條公車路線所對應的公車站編號。 題目要求我們計算出,從起點站source到終點站target的最精簡公車路線搭乘次數是幾次? 也就是說,就是在最少轉乘的前提下,旅途中需要搭乘幾條公車路線?
題目會給我們一個pair陣列,裡面都是原本陣列相鄰元素形成的pair,順序已經被打散。 要求我們從pair陣列重建出原本的陣列。 答案可能有不只一組,任選一組回傳即可。
題目會給定我們一個字串s,要求我們計算出同質子字串有幾個? 同質子字串的定義就是子字串內部的字元都相同,例如a, aa, aaa, ... 等等這些就是同質子字串。
這題的題目在這裡:Gray Code 題目敘述 題目會給我們一個bit寬度n,要求我們造出所有格雷編碼。 格雷編碼就是一組二進位編碼,每兩個相鄰的編碼的hamming distance都是1。 如果第一次接觸的讀者,可以參考 Wiki Gray Code
題目會給我們一個字串陣列nums,內容都是二進位字串,要求我們造出一個另一個相等長度,新的二進位字串,而且不和字串陣列nums內的重複。 答案可能有不只一組,回傳合任一組合法的答案皆可。
題目會給我們一個字串s,內容都是由英文小寫字母組成,要求我們計算長度為3的回文子序列有多少個? 舉例,aba者種形式的序列,就是長度為3的回文序列。
題目會給我們一個routes 陣列,裡面都是分別代表每一條公車路線所對應的公車站編號。 題目要求我們計算出,從起點站source到終點站target的最精簡公車路線搭乘次數是幾次? 也就是說,就是在最少轉乘的前提下,旅途中需要搭乘幾條公車路線?
題目會給我們一個pair陣列,裡面都是原本陣列相鄰元素形成的pair,順序已經被打散。 要求我們從pair陣列重建出原本的陣列。 答案可能有不只一組,任選一組回傳即可。
題目會給定我們一個字串s,要求我們計算出同質子字串有幾個? 同質子字串的定義就是子字串內部的字元都相同,例如a, aa, aaa, ... 等等這些就是同質子字串。
你可能也想看
Google News 追蹤
給定一個長度為 n 的整數數組 nums 和一個整數target,在 nums 中找到三個整數,使得總和最接近target。傳回三個整數的總和。可以假設每個輸入都有一個解決方案。
給定整數陣列nums,傳回所有三元組[nums[i], nums[j], nums[k]],使得i != j, i != k, j != k,且nums[i ] + nums[j] + nums[k] == 0。
Thumbnail
這篇文章介紹了排列和組閤中的錯位排列和排容原理,並提供了一種相對樸實的解題方法。透過例子詳細解釋了選擇情況下的數學原理,讓讀者能夠理解並吸收。文章通過課堂上難以推敲的題目,提出了一個相對簡單的方式來解題。 圖片選自@pngtree
Thumbnail
在看完了咚咚的思辨學堂老師的機率的排列組合 – 在數學上要多加留意題目裡的「換句話說」後。 那題代數轉塗色問題我是真的沒想到。(學會了!😆😆😆) 我決定我也來出幾題。 難度稍高? 邀請大神一同作答激盪出不同的解法。 (一)5對兄妹共舞,若每一兄均不與其妹為舞伴,則共有      
Thumbnail
分享在網路上看到的陣列題目。通常 for...of 的 value 是陣列中的每個值,那如果我們在迭代中對陣列操作會發生什麼事? 題目來源:https://x.com/_jayphelps/status/1774640511158022335?s=20
Thumbnail
這是「按條件算OO」系列文的第五篇教學!今天會來聊聊 MINIFS。
Thumbnail
最近每天都有同學在解題社群提問這類型的問題,有些同學甚至po出解答來提問,表示看了解答卻還是看不懂,畢竟有時候「詳解」也沒辦法完整表達所有觀念。 排列組合是一門龐大的章節,許多人聞排組而色變,但排列組合的本質其實還是「窮舉法」,也就是把全部的可能通通列出來,只是很多地方我們可以透過計算讓窮舉變得更
Thumbnail
這是「按條件算OO」系列文的第四篇教學!今天會來聊聊 MAXIFS。
給定一個長度為 n 的整數數組 nums 和一個整數target,在 nums 中找到三個整數,使得總和最接近target。傳回三個整數的總和。可以假設每個輸入都有一個解決方案。
給定整數陣列nums,傳回所有三元組[nums[i], nums[j], nums[k]],使得i != j, i != k, j != k,且nums[i ] + nums[j] + nums[k] == 0。
Thumbnail
這篇文章介紹了排列和組閤中的錯位排列和排容原理,並提供了一種相對樸實的解題方法。透過例子詳細解釋了選擇情況下的數學原理,讓讀者能夠理解並吸收。文章通過課堂上難以推敲的題目,提出了一個相對簡單的方式來解題。 圖片選自@pngtree
Thumbnail
在看完了咚咚的思辨學堂老師的機率的排列組合 – 在數學上要多加留意題目裡的「換句話說」後。 那題代數轉塗色問題我是真的沒想到。(學會了!😆😆😆) 我決定我也來出幾題。 難度稍高? 邀請大神一同作答激盪出不同的解法。 (一)5對兄妹共舞,若每一兄均不與其妹為舞伴,則共有      
Thumbnail
分享在網路上看到的陣列題目。通常 for...of 的 value 是陣列中的每個值,那如果我們在迭代中對陣列操作會發生什麼事? 題目來源:https://x.com/_jayphelps/status/1774640511158022335?s=20
Thumbnail
這是「按條件算OO」系列文的第五篇教學!今天會來聊聊 MINIFS。
Thumbnail
最近每天都有同學在解題社群提問這類型的問題,有些同學甚至po出解答來提問,表示看了解答卻還是看不懂,畢竟有時候「詳解」也沒辦法完整表達所有觀念。 排列組合是一門龐大的章節,許多人聞排組而色變,但排列組合的本質其實還是「窮舉法」,也就是把全部的可能通通列出來,只是很多地方我們可以透過計算讓窮舉變得更
Thumbnail
這是「按條件算OO」系列文的第四篇教學!今天會來聊聊 MAXIFS。