题目链接: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; } };