給定長度為 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,...