题目描述如下:
给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), …, (an, bn) ,使得从1 到 n 的 min(ai, bi) 总和最大。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/array-partition-i
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
由于要把数组两两配对,且最小值相加总和最大。
个人是这样理解的:可以把组成配对的两个数之间差距尽可能缩小,这样的话加起来的值就一定会是最大的。
而差距最小的配对方式是:先将数组排序,排好序后的数组其相邻元素之间的差距就是最小的,将相邻元素进行两两配对,最后计算min(a,b)之和即可。
排序方法使用快速排序,可以参考博客:
链接: link.
最后是我的代码如下:
class Solution {
public:
int arrayPairSum(vector<int>& nums) {
int sizes = nums.size();
quick_sort(nums,0,sizes-1);
int sum = 0;
for(int i = 0;i < sizes;i+=2)
{
int b = nums[i];
sum += b;
}
return sum;
}
int getindex(vector<int>& nums,int low,int hight)
{
int temp = nums[low];
while(low < hight)
{
while(low < hight && nums[hight] >= temp)
{
hight--;
}
nums[low] = nums[hight];
while(low<hight && nums[low] <= temp)
{
low++;
}
nums[hight] = nums[low];
}
nums[low] = temp;
return low;
}
void quick_sort(vector<int>& nums,int low,int hight)
{
if(low < hight)
{
int index = getindex(nums, low ,hight);
quick_sort(nums,low,index-1);
quick_sort(nums,index+1,hight);
}
}
};
作者:xiao-yang-rw
链接:https://leetcode-cn.com/problems/array-partition-i/solution/pai-xu-by-xiao-yang-rw/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。