zoukankan      html  css  js  c++  java
  • 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; }
  • 相关阅读:
    CSS——制作天天生鲜主页
    HTML——制作一个图片列表
    HTML——制作一个简易菜单栏
    CSS——三种页面引入方法
    【20170903】模拟赛
    【LA 3942】 Remember the word
    【BZOJ 1036】 树的统计count
    UVA 12299 RMQ with shifts
    【20170706】次短路
    【20170706】保卫萝卜
  • 原文地址:https://www.cnblogs.com/mhq-martin/p/12007171.html
Copyright © 2011-2022 走看看