• LeetCode 912. 排序数组


    给你一个整数数组 nums,请你将该数组升序排列。

    示例 1:

    输入:nums = [5,2,3,1]
    输出:[1,2,3,5]
    示例 2:

    输入:nums = [5,1,1,2,0,0]
    输出:[0,0,1,1,2,5]
     

    提示:

    1 <= nums.length <= 50000
    -50000 <= nums[i] <= 50000

      计算排序在使用上很大程度类似hashmap,可以理解为一个有固定长度的hashmap,key是从最小值到最大值,为value就是值出现的次数,没有出现过的为0

    为了简单,通常使用数组或者vector代替hashmap

    1. 很大的计数排序

    std::vector<int> CLeetCode_Solution::sortArray(vector<int>& nums)
    {
        //计数排序
        int N = nums.size();
        //定义所有有效数据总数稍微大点(最大值减去最小值)这就是桶
        vector<int> counter(100010, 0);
        for (int n : nums) {
            //为了桶下标的从0开始+5000,也就在counter中下标是实际值+5000
            //而counter[m]则表示该值出现的次数
            counter[n + 50000] ++;
        }
        vector<int> res(nums.size());
        int idx = 0;
        //循环整个桶,将数据赋值到res中
        for (int i = 0; i < 100010; ++i) {
            for (int j = 0; j < counter[i]; ++j) {
                res[idx++] = i - 50000;
            }
        }
        return res;
    }

    2.优化的计数排序

    优化的桶就是把 mapsum 的大小固定到最大值和最小值的范围    int len = nums.size();

    int minVal = INT_MAX;
        int maxVal = INT_MIN;
      //找出最大最小值
    for (int i = 0; i < len; i++) { minVal = min(nums[i], minVal); maxVal = max(nums[i], maxVal); }
      //建立vec
    int mapsum = maxVal - minVal + 1; vector<int> hmap(mapsum); for (int i = 0; i < len;++i) { //下标为实际值-minval, hmap[0]为最小值; 值为数量,如果值没有出现,该处hmap的值为0,将不计入返回值
    hmap[nums[i] - minVal]++; } int inx = 0; for (int i = 0; i < mapsum;++i) { for (int j = 0;j < hmap[i];++j) { //hmap的下标+minval就是原始的值 nums[inx++] = i + minVal; } } return nums;
  • 相关阅读:
    课程作业四 生成随机数并求和,大数运算
    课程作业三 string,char操作
    课程作业二 类内静态内容(代码块,静态变量),构造函数,非静态代码块执行顺序
    十一作业 java数值范围方面训练
    课程作业一 将字符串型数组里的数字相加
    NABCD需求分析
    人月神话阅读笔记01
    软件工程第五周总结
    清明第三天
    清明第二天安排
  • 原文地址:https://www.cnblogs.com/gongkiro/p/12609588.html
Copyright © 2020-2023  润新知