/*C语言*/
int cmp(const void* a,const void* b){
return *(int*)a>*(int*)b;
}
int arrayPairSum(int* nums, int numsSize){
int sum=0, i;
qsort(nums,numsSize,sizeof(int),cmp);
for(i=0; i<numsSize; i++)
if(i%2 == 0)
sum += nums[i];
return sum;
}
//JAVA
public class Solution {
public int arrayPairSum(int[] nums) {
int[] arr = new int[20001];
int lim = 10000;
for (int num: nums)
arr[num + lim]++;
int d = 0, sum = 0;
for (int i = -10000; i <= 10000; i++) {
sum += (arr[i + lim] + 1 - d) / 2 * i;
d = (2 + arr[i + lim] - d) % 2;
}
return sum;
}
}
/*
for(int i = -10000; i <= 10000; i++ ){
int count = arr[i + lim];
if(count != 0){
//count + 1是为了让奇数在/2时能向上取整
//如果d是1, 也就说明这个数的个数被上一次分配占用了一个, 对偶数没有影响
//但是对奇数, 因为少了一个, 所以还剩偶数个, 所以需要再-d, 实质就是-1, 否则会多分配一对
sum += (count + 1 - d) / 2 * i;
//d就是用来说明这次分配有没有占用下个数的个数, 如果有, 则置1
//要-d是因为要考虑上次分配有没有占用这次的个数, 如果占用了, 那就-1, 也就是-d
//+2是因为 防止count == 1 || count == 0
d = (count - d + 2) & 1;
}
}
*/