• 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; }
  • 相关阅读:
    PHP thinkPHP6.0 部署
    ch09 Sql导入语句
    自定义map 搜索
    MySql 语句
    自定义Mappter
    三袋米的故事
    WPF中实现文件夹对话框(OpenFileDialog in WPF)
    web通过Ajax与WCF交互
    项目管理之我见-程序员程序开发步骤
    存储过程
  • 原文地址:https://www.cnblogs.com/mhq-martin/p/12007171.html
Copyright © 2020-2023  润新知