最小化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
留言分享你的想法!
avatar-img
小松鼠的演算法樂園
96會員
427內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
2024/10/06
題目敘述 Rank Transform of an Array 給定一個陣列arr,請根據數字的大小給予序號,序號值介於1~len( set(arr) )之間。 最大的數字給予最大的序號。 次大的數字給予次大的序號。 ...依此類推 最小的數字給予最小的序號1。
Thumbnail
2024/10/06
題目敘述 Rank Transform of an Array 給定一個陣列arr,請根據數字的大小給予序號,序號值介於1~len( set(arr) )之間。 最大的數字給予最大的序號。 次大的數字給予次大的序號。 ...依此類推 最小的數字給予最小的序號1。
Thumbnail
2024/10/01
題目敘述 Check If Array Pairs Are Divisible by k 給定一個長度為偶數的整數陣列arr,和一個整數k 。 我們想把陣列元素兩兩一組組成pair,使得每個pair的總和可以被k整除。 如果做得到,返回True。 如果不行,返回False。
Thumbnail
2024/10/01
題目敘述 Check If Array Pairs Are Divisible by k 給定一個長度為偶數的整數陣列arr,和一個整數k 。 我們想把陣列元素兩兩一組組成pair,使得每個pair的總和可以被k整除。 如果做得到,返回True。 如果不行,返回False。
Thumbnail
2024/09/29
My Calendar II 給定一個行事曆的class定義和行程安排的介面。 請完成下列function 1.建構子MyCalendarTwo() 2.boolean book(int start, int end) 在行事曆加入一項新行程,起始時間為start, 結束時間為end。
Thumbnail
2024/09/29
My Calendar II 給定一個行事曆的class定義和行程安排的介面。 請完成下列function 1.建構子MyCalendarTwo() 2.boolean book(int start, int end) 在行事曆加入一項新行程,起始時間為start, 結束時間為end。
Thumbnail
看更多
你可能也想看
Thumbnail
題目敘述 題目會給定我們一個整數陣列nums,我們每回合可以挑選總和為K的兩個數字,形成一個K-Sum pair。 請問我們最多可以製造幾個K-Sum pair? 題目的原文敘述 測試範例 Example 1: Input: nums = [1,2,3,4], k = 5 Output
Thumbnail
題目敘述 題目會給定我們一個整數陣列nums,我們每回合可以挑選總和為K的兩個數字,形成一個K-Sum pair。 請問我們最多可以製造幾個K-Sum pair? 題目的原文敘述 測試範例 Example 1: Input: nums = [1,2,3,4], k = 5 Output
Thumbnail
題目敘述 題目會給定一個整數陣列nums,要求我們找出兩組pair,分別是(a,b), 和 (c, d),並且最大化 a*b - c * d 的值。 例如,給定 nums = [5,6,2,7,4] 那麼,最大的差值 = Max { a * b - c * d } = 7 * 6 - 2 *
Thumbnail
題目敘述 題目會給定一個整數陣列nums,要求我們找出兩組pair,分別是(a,b), 和 (c, d),並且最大化 a*b - c * d 的值。 例如,給定 nums = [5,6,2,7,4] 那麼,最大的差值 = Max { a * b - c * d } = 7 * 6 - 2 *
Thumbnail
題目敘述 題目會給定一個整數陣列nums,要求我們找出最大的兩個整數a, b,返回(a-1) * (b-1)的乘積。 詳細的題目可在這裡看到 測試範例 Example 1: Input: nums = [3,4,5,2] Output: 12
Thumbnail
題目敘述 題目會給定一個整數陣列nums,要求我們找出最大的兩個整數a, b,返回(a-1) * (b-1)的乘積。 詳細的題目可在這裡看到 測試範例 Example 1: Input: nums = [3,4,5,2] Output: 12
Thumbnail
題目敘述 題目會給我們一個陣列,要求我們返回 兩數之和=target所在的陣列索引值。 題目還額外保證,一定剛好有一組解。 測試範例 Example 1: Input: nums = [2,7,11,15], target = 9 Output: [0,1]
Thumbnail
題目敘述 題目會給我們一個陣列,要求我們返回 兩數之和=target所在的陣列索引值。 題目還額外保證,一定剛好有一組解。 測試範例 Example 1: Input: nums = [2,7,11,15], target = 9 Output: [0,1]
Thumbnail
題目會給我們一個整數陣列nums,裡面都是正整數,而且陣列長度保證是偶數。 要求我們倆倆將所有整數配對成一組pair,要求我們最小化pair sum的極大值。
Thumbnail
題目會給我們一個整數陣列nums,裡面都是正整數,而且陣列長度保證是偶數。 要求我們倆倆將所有整數配對成一組pair,要求我們最小化pair sum的極大值。
Thumbnail
題目到底要我們做什麼?閱讀素養有多重要,試試這題就知道!
Thumbnail
題目到底要我們做什麼?閱讀素養有多重要,試試這題就知道!
Thumbnail
題目會給們一個陣列,還有一個k值。 好陣列定義是: 有包含nums[k]的子陣列。 分數定義是: min(nums[i], nums[i+1], ..., nums[j]) * (j - i + 1) 其中, i, j 分別是子陣列的左端點和右端點 請問,好的子陣列的最大分數是多少?
Thumbnail
題目會給們一個陣列,還有一個k值。 好陣列定義是: 有包含nums[k]的子陣列。 分數定義是: min(nums[i], nums[i+1], ..., nums[j]) * (j - i + 1) 其中, i, j 分別是子陣列的左端點和右端點 請問,好的子陣列的最大分數是多少?
Thumbnail
題目會給定我們一個輸入陣列,要求我們計算好配對的數目有多少個? 好配對的定義: 兩個數字相同,但是陣列索引一個在前,一個在後。 nums[i] == nums[j] and i < j. 這樣 (i, j) 就稱為一組好配對。
Thumbnail
題目會給定我們一個輸入陣列,要求我們計算好配對的數目有多少個? 好配對的定義: 兩個數字相同,但是陣列索引一個在前,一個在後。 nums[i] == nums[j] and i < j. 這樣 (i, j) 就稱為一組好配對。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News