給定無序陣列,求排序後相鄰元素最大差值。要求 O(N) 時間空間。陣列長度 < 2 返回 0。元素為非負 32 位整數。
設最小值 min、最大值 max、桶數 = n(陣列長度)。
桶寬 gap = (max - min) / n + 1(向上取整)。
最大間隙必發生在桶與桶之間,而非桶內(桶內最大差值 < gap)。
min, maxn 個桶,每桶記錄 min, maxidx = (num - min) / gapmin,與前一非空桶的 max 差值更新答案class Solution {
struct Bucket { int min = INT_MAX, max = INT_MIN; bool used = false; };
public:
int maximumGap(vector& nums) {
int n = nums.size();
if (n <= 1) return 0;
int mn = *min_element(nums.begin(), nums.end());
int mx = *max_element(nums.begin(), nums.end());
if (mn == mx) return 0;
int gap = (mx - mn) / n + 1; // 桶寬
vector buckets(n);
for (int num : nums) {
int idx = (num - mn) / gap;
Bucket& b = buckets[idx];
b.used = true;
b.min = min(b.min, num);
b.max = max(b.max, num);
}
int ans = 0;
int prev_max = mn;
for (const auto& b : buckets) {
if (!b.used) continue;
ans = max(ans, b.min - prev_max);
prev_max = b.max;
}
return ans;
}
};
(max-min)/n + 1 確保桶內差值 < 桶寬prev_max 初始為 mn,最後桶的 max 必為 mx