[leetcode][easy][Array][561][Array Partition I]
Posted libinyl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[leetcode][easy][Array][561][Array Partition I]相关的知识,希望对你有一定的参考价值。
Array Partition I
题目链接
题目描述
给定大小为 2n 的整型数组,你的任务是将这些整数分为n
组,即 (a1,b1), (a2, b2),...,(an, bn),使得所有的 min(ai,bi) 之和最大,其中i的值为从1到n。
输出上述要求中的和。
约定
n
是一个正数,范围是 [1,10000]。- 数组中的整数范围是 [-1000,10000]。
示例
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).
解答
一般解法:排序,每隔一个取值作和。
class Solution
{
public:
int arrayPairSum(vector<int>& nums)
{
std::sort(nums.begin(), nums.end());
int sum = 0;
for (int i = 0; i < nums.size(); i+=2)
{
sum += nums[i];
}
return sum;
}
};
极限解法
由于给定范围,可考虑用桶排序加快速度。
/*
=
= = = = =
= = = = = = =
= = = = = = = =
bucket[0][1][2][3][4][5][6][7][8]
*/
class Solution
{
public:
int arrayPairSum(vector<int>& nums)
{
int sum = 0;
//bucket[i]即为某个值的数量
vector<int> bucket(20001, 0);
for (int i = 0; i < nums.size(); i++)
{
bucket[nums[i] + 10000]++;
}
int flag = 0;
int i = 0;
while (i < bucket.size())
{
if (bucket[i] > 0 && flag == 0)
{
sum += (i - 10000);
bucket[i]--;
flag = 1;
}
else if (bucket[i] > 0 && flag == 1)
{
bucket[i]--;
flag = 0;
}
else
{
i++;
}
}
return sum;
}
};
以上是关于[leetcode][easy][Array][561][Array Partition I]的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode--126273553 Array(Easy)
LeetCode--122167169189217 Array(Easy)
LeetCode--219268283414448 Array(Easy)
LeetCode--Array--Two sum (Easy)