Array Partition I
题目
leetcode题目
Given an array of 2n integers, your task is to group these integers into n pairs of integer, say (a1, b1), (a2, b2), …, (an, bn) which makes sum of min(ai, bi) for all i from 1 to n as large as possible.
Example 1:
Input: [1,4,3,2]
Output: 4
Explanation: n is 2, and the maximum sum of pairs is 4 = min(1, 2) + min(3, 4).
Note:
- n is a positive integer, which is in the range of [1, 10000]. All
- the integers in the array will be in the range of [-10000, 10000].
分析
题目要求在给定的数组里面两两配对,取其中的最小值,使得这些最小值加起来的sum
达到最大值。这样,我们可以尽可能地让小的数两两配对,剩下大的数再进行配对,才能够达到要求。
如果取一大一小的数两两配对,由于是取其中的最小值,所以大的数就会被抛弃,而小的数被留下来,对结果的贡献不大。
因此,我们先将数组进行排序,然后依次两两配对,就可得到结果。
解决
1.sort()函数
在C++中,可用sort()函数直接对vector中的元素进行排序。
class Solution {
public:
int arrayPairSum(vector<int>& nums) {
int result = 0;
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size(); i += 2) {
// 数两两配对,因此每次i需要增加2
result += nums[i];
}
return result;
}
};
2. 利用multiset
利用multiset对插入数据的处理以实现对数组的排序,但是性能不好。
class Solution {
public:
int arrayPairSum(vector<int>& nums) {
int result = 0;
multiset<int> temp;
for (int i = 0; i < nums.size(); i++) {
temp.insert(nums[i]);
}
for (multiset<int>::iterator it = temp.begin(); it != temp.end(); ) {
result += (*it);
it++;
it++;
}
return result;
}
};