持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情
题目(Maximum Gap)
链接:https://leetcode-cn.com/problems/maximum-gap
解决数:581
通过率:60.7%
标签:数组 桶排序 基数排序 排序
相关公司:amazon bytedance microsoft
给定一个无序的数组 nums,返回 数组在排序之后,相邻元素之间最大的差值 。如果数组元素个数小于 2,则返回 0 。
您必须编写一个在「线性时间」内运行并使用「线性额外空间」的算法。
示例 1:
输入: nums = [3,6,9,1]
输出: 3
解释: 排序后的数组是 [1,3,6,9] , 其中相邻元素 (3,6) 和 (6,9) 之间都存在最大差值 3。
示例 2:
输入: nums = [10]
输出: 0
解释: 数组元素个数小于 2,因此返回 0。
提示:
1 <= nums.length <= 1050 <= nums[i] <= 109
思路1,库函数排序
详情看代码
/**
* @param {number[]} nums
* @return {number}
*/
var maximumGap = function(nums) {
let n = nums.length;
if(n < 2) return 0;
nums = nums.sort((a,b) => a - b);
let max = -1;
for(let j = 1;j < n;j++){
let val = nums[j] - nums[j-1];
if(val > max){
max = val;
}
}
return max;
};
思路2,桶 + 鸽笼原理
详情看代码
/**
* @param {number[]} nums
* @return {number}
*/
var maximumGap = function(nums) {
let n = nums.length;
if(n < 2) return 0 ;
let min = Math.min(...nums);
let max = Math.max(...nums);
if( max - min == 0) return 0;
let gap = Math.ceil((max - min) / (n - 1));
let bucketsMin = new Array(n - 1).fill(Number.MAX_SAFE_INTEGER);
let bucketsMax = new Array(n - 1).fill(-1);
for(let i = 0;i < nums.length;i++){
if(nums[i] == min || nums[i] == max) continue;
let idx = parseInt((nums[i] - min) / gap);
bucketsMin[idx] = Math.min(nums[i],bucketsMin[idx]);
bucketsMax[idx] = Math.max(nums[i],bucketsMax[idx]);
}
let maxGap = 0;
let pre = min;
for(let i = 0;i < n - 1;i++){
if(bucketsMax[i] == -1) continue;
maxGap = Math.max(maxGap,bucketsMin[i] - pre);
pre = bucketsMax[i];
}
maxGap = Math.max(maxGap,max - pre);
return maxGap;
};
思路3,基数排序
详情看代码
/**
* @param {number[]} nums
* @return {number}
*/
var maximumGap = function(nums) {
let n = nums.length;
if(n < 2) return 0 ;
let maxDigit = Math.max(...nums).toString().length;
let radixSort = (arr,maxDigit) => {
let digit = 1;
let mod = 10;
let bucket = new Array(10);
for(let i = 0;i < maxDigit;i++){
for(let j = 0;j < arr.length;j++){
let index = Math.floor(arr[j]/digit) % mod;
if(bucket[index] == null) bucket[index] = [];
bucket[index].push(arr[j]);
}
let pos = 0;
for(let r = 0;r < bucket.length;r++){
let val = null;
if(bucket[r]){
while((val = bucket[r].shift()) != null){
arr[pos++] = val;
}
}
}
digit *= 10;
}
}
radixSort(nums,maxDigit);
let max = -1;
for(let j = 1;j < n;j++){
let val = nums[j] - nums[j-1];
if(val > max){
max = val;
}
}
return max;
};