# [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++ ## 思路一 ``` class Solution { public: int arrayPairSum(vector& nums) { sort(nums.begin(), nums.end()); int sum = 0; for(int i = 0; i < nums.size()/2; i++) sum += nums[i * 2]; return sum; } }; ``` ## 思路二 ``` class Solution { public: int arrayPairSum(vector& nums) { vector hashtable(20001,0); for(size_t i=0;i0)&&(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; } }; ```