Given an unsorted array, find the maximum difference between the successive elements in its sorted form.
Return 0 if the array contains less than 2 elements.
Example
Given
[1, 9, 2, 5]
, the sorted form of it is [1, 2, 5, 9]
, the maximum gap is between 5
and 9
= 4
.
Note
You may assume all elements in the array are non-negative integers and fit in the 32-bit signed integer range.
Challenge
Sort is easy but will cost O(nlogn) time. Try to solve it in linear time and space.
Analysis:
Find the max and min element of the array, and map all elements into n buckets based their relative value to the min value. Element a will be mapped into the index i = (a-min)*(n-1)/(max-min).
Maintain the max and min elements in each bucket. The maximum gap must be one of the gaps of max and min in adjacent buckets.
Analysis:
Find the max and min element of the array, and map all elements into n buckets based their relative value to the min value. Element a will be mapped into the index i = (a-min)*(n-1)/(max-min).
Maintain the max and min elements in each bucket. The maximum gap must be one of the gaps of max and min in adjacent buckets.
class Solution { public: int maximumGap(vector<int> nums) { // write your code here int len = nums.size(); if(len < 2) return 0; int minV = INT_MAX, maxV = INT_MIN; for(auto e : nums){ minV = min(minV, e); maxV = max(maxV, e); } if(maxV == minV) return 0; float gap = (maxV - minV)/(float)(len-1); vector<int> maxBucket(len, INT_MIN),minBucket(len, INT_MAX); for(auto e: nums){ int i = (e-minV)/gap; maxBucket[i] = max(maxBucket[i], e); minBucket[i] = min(minBucket[i], e); } int previous = minV; int res = INT_MIN; for(int i=1;i<len;i++){ if(maxBucket[i] == INT_MIN && minBucket[i] == INT_MAX) continue; res = max(res, minBucket[i]-previous); previous = maxBucket[i]; } return res; } };