給定一個無序的數組,找出數組在排序之後,相鄰元素之間最大的差值。
如果數組元素個數小於 2,則返回 0。
示例 1:
輸入: [3,6,9,1]
輸出: 3
解釋: 排序後的數組是 [1,3,6,9], 其中相鄰元素 (3,6) 和 (6,9) 之間都存在最大差值 3。
示例 2:
輸入: [10]
輸出: 0
解釋: 數組元素個數小於 2,因此返回 0。
說明:
你可以假設數組中所有元素都是非負整數,且數值在 32 位有符號整數範圍內。
請嘗試在線性時間複雜度和空間複雜度的條件下解決此問題。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/maximum-gap
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
class Solution {
public:
int maximumGap(vector<int>& nums) {
int len = nums.size();
if(len < 2)
return 0;
auto mn_mx = minmax_element(nums.begin(), nums.end());
int mn = *mn_mx.first;
int mx = *mn_mx.second;
int bucket_size = max((mx - mn) / (len - 1), 1);
int bucket_num = (mx - mn) / bucket_size + 1;
vector<int> min_arr(bucket_num, INT_MAX);
vector<int> max_arr(bucket_num, INT_MIN);
vector<int> bucket_cnt(bucket_num, 0);
for(int num : nums)
{
int index = (num - mn) / bucket_size;
bucket_cnt[index] ++;
min_arr[index] = min(min_arr[index], num);
max_arr[index] = max(max_arr[index], num);
}
int max_gap = 0;
int last_max = mn;
for(int i = 0; i < bucket_num; i++)
{
if(bucket_cnt[i] > 0)
{
max_gap = max(max_gap, min_arr[i] - last_max);
last_max = max_arr[i];
}
}
return max_gap;
}
};