zoukankan      html  css  js  c++  java
  • 20.11.26 leetcode164 基数排序

    题目链接:https://leetcode-cn.com/problems/maximum-gap/submissions/

    题意:给一个无序的数组,让你求排完序后的数组,相邻两值的差值最大为多少,时间和空间复杂度要求线性(O(N))。

    分析:主要是排序,像快排和归并排序都是O(nlogn)的,不满足要求,这里可以用基数排序,基数排序的话就是先按个位排序,再按十位,然后百位...等所有位都排完后,便是排好序的数组了。具体到代码部分,cnt存的就是当前位为0-9的个数,cnt[i]+=cnt[i-1]这一步其实就是内部的排序,因为当前位数更大的在后面,然后就没什么可说的了,直接看代码把。

    class Solution {
    public:
        int maximumGap(vector<int>& nums) {
            int n=nums.size();
            if(n<2)return 0;
            int mx=*max_element(nums.begin(),nums.end());
            int exp=1;
            vector<int> buf(n);
            while(exp<=mx){
                vector<int> cnt(10);
                for(int i=0;i<n;i++){
                    int digit=(nums[i]/exp)%10;
                    cnt[digit]++;
                }
                for(int i=1;i<10;i++)cnt[i]+=cnt[i-1];
                for(int i=n-1;i>=0;i--){
                    int digit=(nums[i]/exp)%10;
                    buf[cnt[digit]-1]=nums[i];
                    cnt[digit]--;
                }
                copy(buf.begin(),buf.end(),nums.begin());
                exp*=10;
            }
            int ret=0;
            for(int i=1;i<n;i++){
                ret=max(ret,nums[i]-nums[i-1]);
            }
            //cout<<nums[0]<<" "<<nums[1];
            return ret;
        }
    };
  • 相关阅读:
    ssh端口转发
    linux git命令安装
    linux git命令
    linux cpio命令
    linux 抓包工具
    js 深拷贝 ,浅拷贝
    vue $router 打开新窗口
    excel常用操作
    Kafka Topic的增删改查操作
    linux上删除文件名乱码的文件
  • 原文地址:https://www.cnblogs.com/qingjiuling/p/14041092.html
Copyright © 2011-2022 走看看