题目描述:
给定长度为 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).
提示:
n 是正整数,范围在 [1, 10000].
数组中的元素范围在 [-10000, 10000].
题解:
/* 思路: 排序,然后将下标为 0、2、4 ... 个数相加即可。 由于是纯数字,并且限定了数字范围,所以可使用基数排序达到 O(n) 复杂度。 数字范围 [-10000, 10000],所以可创建 n[20001],对每个元素加 10000 使其变为正数。 */ int arrayPairSum(int* nums, int numsSize) { int n[20001] = { 0 }, i, j, sum; for (i = 0; i < numsSize; i++) //建立值、键哈希表,即基数排序 n[nums[i] + 10000]++; //保证下标为正数 for (i = j = sum = 0; i < 20001; ) //将下标为 0、2、4 ... 的相加 {
if (n[i]) //判断是否存在该数,若存在则判断是否偶数下标 { if (j % 2 == 0) sum += i - 10000; //偶数下标,累加 j++; //计数 n[i]--; //该值减 1 } else i++; //不存在,跳过该值
}
return sum; }