LeetCode 561 陣列拆分I

2021-09-27 07:47:21 字數 1120 閱讀 7831

給定長度為 2n 的陣列, 你的任務是將這些數分成 n 對, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得從1 到 n 的 min(ai, bi) 總和最大。

示例 1:

輸入: [1,4,3,2]

n 是正整數,範圍在 [1, 10000].

陣列中的元素範圍在 [-10000, 10000].

(1)按照題目的要求,如果想得從1 到 n 的 min(ai, bi) 總和最大,那麼需要將陣列進行排序,然後取奇數字置上的數進行想加求和,即為結果。

(2)上一步利用貪心演算法的思想,因為min(ai, bi)取兩個數中的最小值作為結果,所以我們沒有辦法取到最大值。這樣如果想保證總和最大,首先將陣列從小到大排序,按照順序分成n組,每組取最小數作為結果進行相加才能最大,由區域性最優得到全域性最優。

(3)我們可以分析一下,從第n組開始依次往前看,因為最大數無論和誰一組都無法取到,那只能退而求其次得到第二大的數,所以只能將它們放在一組。對於第n-1組而言,如果想獲得第三大數,只能將它與第二大數放在一起,那這樣的損失會更多,不僅不能取得最大值還無法取到第二大的值,因此為了能獲得第二大數損失掉第三大數是值得的,所以將第三大數和第四大數放一起。這樣依次類推,可以看出排序後再按順序分組是正確的。

第一種方法:使用sort排序

int arraypairsum(vector& nums) 

return sum;

}

第二種方法:使用qsort排序,注意引數comp為乙個全域性函式不能是成員函式

int cmp(const void* a, const void* b)

class solution

return sum;}};

第一種方法結果:

第二種方法結果:

LeetCode561 陣列拆分 I

給定長度為2n的陣列,你的任務是將這些數分成n對,例如 a1,b1 a2,b2 an,bn 使得從1 到 n 的 min ai,bi 總和最大。示例 1 輸入 1,4,3,2 輸出 4 解釋 n 等於 2,最大總和為 4 min 1,2 min 3,4 n是正整數,範圍在 1,10000 陣列中的元...

LeetCode 561 陣列拆分 I

給定長度為2n的陣列,你的任務是將這些數分成n對,例如 a1,b1 a2,b2 an,bn 使得從1 到 n 的 min ai,bi 總和最大。示例 1 輸入 1,4,3,2 輸出 4 解釋 n 等於 2,最大總和為 4 min 1,2 min 3,4 n是正整數,範圍在 1,10000 陣列中的元...

LeetCode 561 陣列拆分I

561.陣列拆分 給定長度為 2n 的整數陣列 nums 你的任務是將這些數分成 n 對,例如 a1,b1 a2,b2 an,bn 使得從 1 到 n 的 min ai,bi 總和最大。返回該 最大總和 示例 1 輸入 nums 1,4,3,2 輸出 4 解釋 所有可能的分法 忽略元素順序 為 1,...