📅  最后修改于: 2023-12-03 15:26:11.600000             🧑  作者: Mango
给定一个未排序的数组,找到其中最大的间隙。
如果数组中至少有2个元素,返回数组排序后相邻两个元素之间最大的差值。
你能否在线性时间复杂度和空间复杂度的情况下解决此问题?
题目要求线性时间复杂度和空间复杂度,因此不能使用排序算法。我们可以考虑使用桶排序。
class Solution {
public:
int maximumGap(vector<int>& nums) {
if (nums.size() < 2) {
return 0;
}
int minVal = INT_MAX;
int maxVal = INT_MIN;
for (int num : nums) {
minVal = min(minVal, num);
maxVal = max(maxVal, num);
}
int bucketSize = max(1, (maxVal - minVal) / ((int)nums.size() - 1));
int bucketNum = (maxVal - minVal) / bucketSize + 1;
//初始化桶及桶内值的最大值和最小值
vector<pair<int, int>> buckets(bucketNum, {-1, -1});
for (int num : nums) {
int index = (num - minVal) / bucketSize;
if (buckets[index].first == -1) {
buckets[index] = {num, num};
} else {
buckets[index].first = min(buckets[index].first, num);
buckets[index].second = max(buckets[index].second, num);
}
}
int preMax = minVal;
int maxGap = 0;
for (auto bucket : buckets) {
if (bucket.first == -1) {
continue;
}
maxGap = max(maxGap, bucket.first - preMax);
preMax = bucket.second;
}
return maxGap;
}
};
时间复杂度:$O(n)$,其中n为数组长度。
空间复杂度:$O(n)$,需要使用桶来存储数据。
题目满足时间复杂度和空间复杂度的要求,本算法可通过此题。