【leetcode】561. 数组拆分 I

 

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

 

posted @ 2020-12-02 09:16  温暖了寂寞  阅读(75)  评论(0编辑  收藏  举报