其他分享
首页 > 其他分享> > Leetcode-561. 数组拆分 I

Leetcode-561. 数组拆分 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).
提示:

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

 

标签:下标,min,++,561,sum,int,拆分,10000,Leetcode
来源: https://www.cnblogs.com/mhq-martin/p/12007171.html