1. 程式人生 > >[leetcode][easy][Array][561][Array Partition I]

[leetcode][easy][Array][561][Array Partition I]

Array Partition I

題目連結

題目描述

給定大小為 2n 的整型陣列,你的任務是將這些整數分為n組,即 (a1,b1), (a2, b2),...,(an, bn),使得所有的 min(ai,bi) 之和最大,其中i的值為從1到n。

輸出上述要求中的

約定

  1. n是一個正數,範圍是 [1,10000]。
  2. 陣列中的整數範圍是 [-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;
    }
};