LeetCode:164. 最大间距

题目描述

给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。

如果数组元素个数小于 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 方法的内部排序算法有关。

猜你喜欢

转载自blog.csdn.net/qq_39025670/article/details/104592342