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.
Credits:
Special thanks to @porker2008 for adding this problem and creating all test cases.
class Solution {
public:
int maximumGap(vector<int>& nums) {
if(nums.size() < 2)
return 0;
int max = INT_MIN;
int min = INT_MAX;
int result = INT_MIN;
for(int i = 0; i < nums.size(); i++){
max = std::max(max, nums[i]);
min = std::min(min, nums[i]);
}
int bucketlen = std::max((max-min)/((int)nums.size()-1), 1);
int bucketsize = (max-min)/bucketlen + 1;
vector<int> mins(bucketsize, INT_MAX);
vector<int> maxs(bucketsize, INT_MIN);
for(int i = 0; i < nums.size(); i++){
int temp = (nums[i]-min) / bucketlen;
mins[temp] = std::min(mins[temp], nums[i]);
maxs[temp] = std::max(maxs[temp], nums[i]);
}
int l = -1;
for(int i = 0; i < bucketsize; i++){
if(mins[i] != INT_MAX){
if(l == -1){
l = i;
continue;
}
if(l != -1){
result = std::max(result, mins[i] - maxs[l]);
l = i;
}
}
}
return result;
}
};