题目描述:
Given an unsorted array, find the maximum difference between the successive elements in its sorted form.
Try to solve it in linear time/space.
Return 0 if the array contains less than 2 elements.
You may assume all elements in the array are non-negative integers and fit in the 32-bit signed integer range.
分析:
利用桶排序求解。首先,遍历数组nums[]求得min和max。假设数组共有N个数,则所求的解必然大于等于len=(max-min)/(N-1)(向上取整,且在N个数均匀分布时取得)。接着再遍历一次数组,将(nums[i]-min)/len作为下标,放入相应的桶中。其中,每个桶只需要维护该桶内的最大值和最小值即可。因为,每个桶里面所有的数最大不会相差len,所以桶内部是不存在解的,因此解只可能在相邻的桶中获得,即后一个桶的最小值减去前一个桶的最大值是可能的解。最后再从这些差值中取得一个最大值即可。
代码:
class Solution { public: int maximumGap(vector<int>& nums) { if(nums.size()<2){ return 0; } int min=nums[0],max=nums[0]; for(int i=1;i<nums.size();i++){ min = nums[i]<min ? nums[i]:min; max = nums[i]>max ? nums[i]:max; } if(min==max){ //数组中每个元素都相同 return 0; } int len; if((max-min)%(nums.size()-1)==0){ len=(max-min)/(nums.size()-1); }else{ len=(max-min)/(nums.size()-1)+1; } //每个桶只要保存最大值和最小值即可 int* bMin=new int[nums.size()]; int* bMax=new int[nums.size()]; for(int i=0;i<nums.size();i++){ bMax[i]=0x80000000; } for(int i=0;i<nums.size();i++){ int p=(nums[i]-min)/len; if(bMax[p]==0x80000000){ //空桶直接插入 bMax[p]=bMin[p]=(nums[i]-min); }else{ bMax[p] = bMax[p]>(nums[i]-min) ? bMax[p]:(nums[i]-min); bMin[p] = bMin[p]<(nums[i]-min) ? bMin[p]:(nums[i]-min); } } int pre=0; int cur=1; int ans=0x80000000; while(cur<nums.size()){ while(cur<nums.size()&&bMax[cur]==0x80000000){//找到下一个不为空的桶 cur++; } if(cur==nums.size()){ break; } ans = ans>(bMin[cur]-bMax[pre]) ? ans:(bMin[cur]-bMax[pre]); pre=cur; cur++; } return ans; } };