[leetcode][easy][Array][561][Array Partition I]
阿新 • • 發佈:2018-12-18
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; } };