给定一个未经排序的数组,请找出其排序表中连续两个要素的最大间距。
如果数组中的要素少于 2 个,请返回 0.
样例
给定数组 [1, 9, 2, 5]
,其排序表为 [1, 2, 5, 9]
,其最大的间距是在 5
和9
之间,= 4
.
注意
可以假定数组中的所有要素都是非负整数,且最大不超过 32 位整数。
挑战
排序十分简单,但将使用 O(nlogn) 时间复杂度。请避免使用线性时间复杂度和空间。
class Solution {
public:
/**
* @param nums: a vector of integers
* @return: the maximum difference
*/
int maximumGap(vector<int> nums) {
// write your code here
if(nums.empty() || nums.size() == 1)
return 0;
int n = nums.size();
int minAll = nums[0];
int maxAll = nums[0];
for (int i = 1; i < nums.size(); i++)
{
minAll = min(minAll, nums[i]);
maxAll = max(maxAll, nums[i]);
}
double gap = ((double)(maxAll - minAll)) / (n - 1);
vector<int> minV(n-1, INT_MAX);
vector<int> maxV(n-1, INT_MIN);
for (int i = 0; i < n; i ++)
{
if(nums[i] != maxAll)
{
int id = (int)((nums[i]-minAll)/gap);
minV[id] = min(minV[id], nums[i]);
maxV[id] = max(maxV[id], nums[i]);
}
}
int result = 0;
int curMax = maxV[0];
for(int i = 1; i < n-1; i ++)
{
if (minV[i] != INT_MAX)
{
result = max(result, minV[i]-curMax);
curMax = maxV[i];
}
}
result = max(result, maxAll-curMax);
return result;
}
};