题意:
给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对,
例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从 1 到 n 的 min(ai, bi) 总和最大。
返回该 最大总和 。
数据范围:
1 <= n <= 1e4
nums.length == 2 * n
-1e4 <= nums[i] <= 1e4
解法:
设下标[1,2n]
题目要使得从1到n的min(ai, bi)总和最大.
对a数组从小到大排序,
首先能发现,a[1]一定是会对答案造成贡献的,因为它一定是二元组内的较小值,
ai=a[1],那么bi不管是什么都不会对答案造成贡献,
为了使得min(ai, bi)总和最大,贪心地令bi=a[2],即消去一个次小值,
这样的话后面的min就是a[3]了.
a数组已经排序过了,那么最后答案是(a[1],a[2]),(a[3],a[4])...
因此ans=a[1]+a[3]+a[5]...
code:
class Solution {
public:
int arrayPairSum(vector<int>& a) {
sort(a.begin(),a.end());
int n=(int)a.size()/2;
int ans=0;
for(int i=0;i<n*2;i+=2){
ans+=a[i];
}
return ans;
}
};