题目详情:
给定一个无序的数组 nums,返回 数组在排序之后,相邻元素之间最大的差值 。如果数组元素个数小于 2,则返回 0 。
您必须编写一个在「线性时间」内运行并使用「线性额外空间」的算法。
示例:
输入: nums = [3,6,9,1]
输出: 3
解题思路:
这个题目是考到了桶排序的知识。
首先,判断数组长度是否小于 2 ,若是,则直接返回 0。
然后,使用 Math.min 和 Math.max 分别找出数组中的最小值 minVal 和最大值 maxVal。
根据桶排序思想,计算桶的大小和数量。桶的大小通过 (maxVal - minVal) / (n - 1) 计算得到,桶的数量通过 (maxVal - minVal) / bucketSize + 1 计算得到。
初始化桶的最小值数组 minBucket 和最大值数组 maxBucket ,将每个桶的初始值都设置为较大或较小的安全整数。
接下来,遍历数组 nums ,根据元素的值找到对应的桶,并更新该桶的最小值和最大值。
最后,遍历桶,计算相邻桶之间的最大差值。定义一个变量 maxGap 保存最大差值,定义变量 prevMax 保存上一个桶的最大值。遍历过程中,若当前桶不为空(最大值不等于初始值),则计算当前桶的最小值与上一个桶的最大值之间的差值,并更新 maxGap 和 prevMax。
最终将 maxGap 作为结果返回。
代码实现:
function maximumGap(nums) {
const n = nums.length;
if (n < 2) {
return 0;
}
// 找到数组中的最小值和最大值
const minVal = Math.min(...nums);
const maxVal = Math.max(...nums);
// 计算桶的大小和数量
const bucketSize = Math.max(1, Math.floor((maxVal - minVal) / (n - 1)));
const bucketCount = Math.floor((maxVal - minVal) / bucketSize) + 1;
// 初始化桶的最小值和最大值
const minBucket = Array(bucketCount).fill(Number.MAX_SAFE_INTEGER);
const maxBucket = Array(bucketCount).fill(Number.MIN_SAFE_INTEGER);
// 遍历数组,确定每个桶的最小值和最大值
for (let i = 0; i < n; i++) {
const num = nums[i];
const index = Math.floor((num - minVal) / bucketSize);
minBucket[index] = Math.min(minBucket[index], num);
maxBucket[index] = Math.max(maxBucket[index], num);
}
// 计算相邻桶之间的最大差值
let maxGap = 0;
let prevMax = maxBucket[0];
for (let i = 1; i < bucketCount; i++) {
if (minBucket[i] !== Number.MAX_SAFE_INTEGER) {
maxGap = Math.max(maxGap, minBucket[i] - prevMax);
prevMax = maxBucket[i];
}
}
return maxGap;
}
// 示例输入
const nums = [3, 6, 9, 1];
// 调用函数并输出结果
console.log(maximumGap(nums));