/*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; } } */