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;
    }
};
原文地址:https://www.cnblogs.com/qingjiuling/p/14041092.html