从一个无序的整数数组中,找出最小和最大数之间缺失的数字,要求最小的时间复杂度

要找到无序整数数组中最小值和最大值之间缺失的数字,并保证最小的时间复杂度,可以使用以下方法:

1. 使用集合 (Set)

这是最简洁且时间复杂度较低的方法,时间复杂度为 O(n),空间复杂度也是 O(n)。

function findMissingNumbers(arr) {
  if (!arr || arr.length < 2) {
    return []; // 处理空数组或只有一个元素的数组
  }

  let min = Math.min(...arr);
  let max = Math.max(...arr);
  const numSet = new Set(arr);
  const missing = [];

  for (let i = min + 1; i < max; i++) {
    if (!numSet.has(i)) {
      missing.push(i);
    }
  }

  return missing;
}


// 示例
const arr = [1, 3, 5, 2, 7, 9, 4];
const missingNumbers = findMissingNumbers(arr);
console.log(missingNumbers); // 输出: [6, 8]

const arr2 = [1, 2, 3];
const missingNumbers2 = findMissingNumbers(arr2);
console.log(missingNumbers2); // 输出: []

const arr3 = [3, 1];
const missingNumbers3 = findMissingNumbers(arr3);
console.log(missingNumbers3); // 输出: [2]

const arr4 = [];
const missingNumbers4 = findMissingNumbers(arr4);
console.log(missingNumbers4); // 输出: []

const arr5 = [5];
const missingNumbers5 = findMissingNumbers(arr5);
console.log(missingNumbers5); // 输出: []


2. 使用排序

排序后,查找缺失数字会更容易,但时间复杂度取决于排序算法,通常为 O(n log n)。 如果数组已经排好序,则此方法的时间复杂度为 O(n)。

function findMissingNumbersSorted(arr) {
  if (!arr || arr.length < 2) {
    return [];
  }
  arr.sort((a, b) => a - b); // 排序数组

  const missing = [];
  for (let i = 1; i < arr.length; i++) {
    if (arr[i] - arr[i - 1] > 1) {
      for (let j = arr[i - 1] + 1; j < arr[i]; j++) {
        missing.push(j);
      }
    }
  }
  return missing;
}

// 示例 (与上面相同)
const arr = [1, 3, 5, 2, 7, 9, 4];
const missingNumbers = findMissingNumbersSorted(arr);
console.log(missingNumbers); // 输出: [6, 8]

// ... 其他示例

方法比较:

  • 集合方法: 更简洁,时间复杂度更低 (O(n)),但需要额外的空间来存储集合。 在大多数情况下,这是首选方法。
  • 排序方法: 如果数组已经排好序,则效率很高 (O(n))。 否则,排序步骤会增加时间复杂度 (O(n log n))。

选择哪种方法?

  • 对于前端开发,并且数组长度不太大的情况下,Set 方法通常是最佳选择,因为它代码简洁且性能良好。
  • 如果数组已经排好序,或者对空间复杂度有严格限制,则可以考虑排序方法。

希望这些解释和代码示例能够帮助你理解如何在 JavaScript 中有效地找到缺失的数字。

posted @   王铁柱6  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示