尽量把小的数字分到一组就可以了。用快排,然后把0,2,4,6...个数相加。一开始写了个插排超时了。
class Solution {
public:
void quickSort(vector<int>& s, int l, int r){
if (l < r)
{
int i = l, j = r, x = s[l];
while (i < j)
{
while (i < j && s[j] >= x) j--;
if (i < j) s[i++] = s[j];
while (i < j && s[i] < x) i++;
if (i < j) s[j--] = s[i];
}
s[i] = x;
quickSort(s, l, i - 1);
quickSort(s, i + 1, r);
}
}
int arrayPairSum(vector<int>& nums) {
int sum = 0;
quickSort(nums, 0, nums.size() - 1);
for (int i = 0; i < nums.size(); i=i+2)
sum = sum + nums[i];
return sum;
}
};
看到一个比较有趣的解法。因为已经知道了数据范围是(-10000,+10000),所以直接把数据按下标分配到(0,20000)的数组中,数组中的值记录的是这个数出现的次数。flag控制当前这个数是一个group中小的那个还是大的那个(flag=0的时候加,=1的时候不加)。
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;
}
};