leetcode561-数组拆分I

原题

给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), …, (an, bn) ,使得从1 到 n 的 min(ai, bi) 总和最大。

示例 1:

输入:[1,4,3,2] 输出: 4
解释: n 等于 2, 最大总和为 4 = min(1, 2) + min(3, 4).

提示:

  1. n 是正整数,范围在 [1, 10000].
  2. 数组中的元素范围在 [-10000, 10000].

解法

思想

通过观察发现,最后总和应该是所有数排完序后偶数下标的元素的值的总和。

代码

class Solution {
    public int arrayPairSum(int[] nums) {
        Arrays.sort(nums);
        int i = 0;
        int sum = 0;
        while(i<nums.length){
            sum+=nums[i];
            i+=2;
        }
        return sum;
    }
}

还有一种排序方法:因为已知数的范围都是在[-10000, 10000]中,可以利用额外的空间排序。
这种方法由于排序更快,时间复杂度较低,但只适用于数值范围已知且对空间复杂度要求不高的情况。

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

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/leetcode561-%e6%95%b0%e7%bb%84%e6%8b%86%e5%88%86i/