# [561. Array Partition I](https://leetcode.com/problems/array-partition-i/description/)
# 思路
## 思路一
仔细分析题目，先进行一个min(ai, bi)的操作再进行sum，而且要求和尽可能大。   
min(ai, bi)操作可以看做是去掉一个二者之间较大的数，即我们要使每次min(ai, bi)去掉的值不太大最好，很容易想到当ai、bi最接近时最好。  
例如，若a < b < c < d, 那么应该分成a、b, c、d，这样sum就为a+c，若分为a、c，b、d，那么sum就为a+b  
即如果将数组排序，那么结果就是偶数位置的元素和。
## 思路二
由于元素范围已知，所以排序时可考虑用hash进行O(n)的排序。

# C++
## 思路一
```C++
class Solution {
public:
    int arrayPairSum(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        int sum = 0;
        for(int i = 0; i < nums.size()/2; i++)
            sum += nums[i * 2];
        return sum;
    }
};
```
## 思路二
```C++
class Solution {
public:
    int arrayPairSum(vector<int>& nums) {
        vector<int> hashtable(20001,0);
        for(size_t i=0;i<nums.size();i++)
        {
            hashtable[nums[i]+10000]++;
        }
        int ret=0;
        int flag=0;
        for(size_t i=0;i<20001;){
            if((hashtable[i]>0)&&(flag==0)){
                ret=ret+i-10000;
                flag=1;
                hashtable[i]--;
            }else if((hashtable[i]>0)&&(flag==1)){
                hashtable[i]--;
                flag=0;
            }else i++;
        }
        return ret;
    }
};
```
