跳到主要内容

元素差值

最大间距

给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。如果数组元素个数小于 2,则返回 0。

示例1:

输入: [3,6,9,1]
输出: 3
解释: 排序后的数组是 [1,3,6,9], 其中相邻元素 (3,6) 和 (6,9) 之间都存在最大差值 3。

示例2:

输入: [10]
输出: 0
解释: 数组元素个数小于 2,因此返回 0。

方案A 基于基数排序找出最大间距

思路: 将数组排序后再找出最大间距

function maximumGap(nums) {
if(nums.length<2){
return 0
}
let max=Math.max(...nums);
let maxDigit=String(max).length;
let range=10;
for(let i=0,digit=1;i<maxDigit;i++,digit*=10){
let bucketNums=new Array(range).fill(0).map(value=>new Array());
for(let j=0;j<nums.length;j++){
let redix=Math.floor(nums[j]/digit)%10;
bucketNums[redix].push(nums[j]);
}
let index=0;
for(let j=0;j<range;j++){
if(bucketNums[j].length){
for(let k=0;k<bucketNums[j].length;k++){
nums[index++]=bucketNums[j][k];
}
}
}
}
let diff=0;
for(let i=1;i<nums.length;i++){
diff=Math.max(diff,nums[i]-nums[i-1]);
}
return diff;
};

性能分析:

  • 时间复杂度:O(N),其中 N 是数组的长度。
  • 空间复杂度:O(N),其中 N 是数组的长度。

最小差值

给你一个整数数组 nums,请你给数组中的每个元素 nums[i] 都加上一个任意数字 x (-k <= x <= k),从而得到一个新数组 result 。

返回数组 result 的最大值和最小值之间可能存在的最小差值。

示例1:

输入:nums = [1], k = 0
输出:0
解释:result = [1]

示例2:

输入:nums = [0,10], k = 2
输出:6
解释:result = [2,8]

思路:A 数组中的每个数可以波动 [-K, K],其中的最小差值就是 最大值−k 和 最小值+k 的差值,如果差值 <0,则说明每个数字都可以波动成相等的数字,直接返回 0 即可。

function smallestRangeI(nums, k) {
let max=Math.max(...nums);
let min=Math.min(...nums);
return Math.max(0,max-min-2*k);
};

性能分析:

  • 时间复杂度: O(N),其中 N 是 A 的长度。
  • 空间复杂度: O(1)