题目描述:
给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。
如果数组元素个数小于 2,则返回 0。
示例 1:
输入: [3,6,9,1]
输出: 3
解释: 排序后的数组是 [1,3,6,9], 其中相邻元素 (3,6) 和 (6,9) 之间都存在最大差值 3。
示例 2:
输入: [10]
输出: 0
解释: 数组元素个数小于 2,因此返回 0。
说明:
你可以假设数组中所有元素都是非负整数,且数值在 32 位有符号整数范围内。
请尝试在线性时间复杂度和空间复杂度的条件下解决此问题。
题目链接:https://leetcode-cn.com/problems/maximum-gap/
解题分析:
方案一:利用 js 的 sort 方法先进行排序,然后遍历排序后的数组,找出最大差值;
方案二:利用冒泡排序,在排序的过程中找出最大差值。
这里先看方案一的实现
题目答案:
var maximumGap = function(arr) {
// 当长度小于 2 时
if (arr.length < 2) {
return 0
}
arr.sort((a, b) => a - b) // 先排序,升序
let max = 0
let tmp
let len = arr.length - 1
for (let i = 0; i < len; i++) {
tmp = arr[i + 1] - arr[i]
if (max < tmp) {
max = tmp
}
}
return max
};
测试结果:
方案二的实现:
var maximumGap = function(arr) {
// 当长度小于 2 时
if (arr.length < 2) {
return 0
}
// 利用冒泡排序,在排序过程中找出间隔最大值
let max = 0
let tmp
let len = arr.length
for (let i = len; i > 0; i--) {
for (let j = 0; j < i; j++) {
if (arr[j] > arr[j + 1]) {
// 利用解构赋值,交换值
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]
}
}
// 从第二轮排序开始找差值(注意:这里循环没有执行 i = 0)
if (i < len) {
tmp = arr[i + 1] - arr[i]
if (tmp > max) {
max = tmp
}
}
}
return Math.max(max, arr[1] - arr[0])
};
测试结果:
我们发现方案二的结果不如方案一,这与我们的预期相悖,这个原因和 sort 方法的内部排序算法有关。