164. 最大间距
程序员文章站
2022-04-04 10:01:05
...
给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。
如果数组元素个数小于 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;
}
};