題目詳情:
給定一個無序的數組 nums,返回 數組在排序之后,相鄰元素之間最大的差值 。如果數組元素個數小于 2,則返回 0 。
您(nin)必須編(bian)寫一個在「線性時間(jian)」內運(yun)行(xing)并使(shi)用(yong)「線性額(e)外(wai)空(kong)間(jian)」的算法。
示例:
輸入: 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。
最(zui)終(zhong)將 maxGap 作(zuo)為結果返回(hui)。
代碼實現:
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));