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

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

时间:2024-11-30 09:47:51浏览次数:10  
标签:arr const log 最大数 复杂度 最小 数组 findMissingNumbers

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

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 中有效地找到缺失的数字。

标签:arr,const,log,最大数,复杂度,最小,数组,findMissingNumbers
From: https://www.cnblogs.com/ai888/p/18578050

相关文章

  • 写一个方法实现“插入排序算法”,并解释下时间复杂度和空间复杂度
    /***插入排序算法*@param{Array<number>}arr待排序的数组*@returns{Array<number>}排序后的数组*/functioninsertionSort(arr){constn=arr.length;if(n<=1){returnarr;//空数组或只有一个元素的数组无需排序}for(leti=1;i<......
  • 写一个方法实现“归并排序算法”,并解释下时间复杂度和空间复杂度
    functionmergeSort(arr){if(arr.length<=1){returnarr;//递归终止条件:数组长度小于等于1时,已经有序}constmid=Math.floor(arr.length/2);constleft=arr.slice(0,mid);constright=arr.slice(mid);//递归地对左右两部分进行排序c......
  • 写一个方法实现“桶排序算法”,并解释下时间复杂度和空间复杂度
    /***桶排序算法(BucketSort)**@param{number[]}arr待排序数组,元素值应在[minVal,maxVal]范围内*@param{number}minVal数组元素最小值*@param{number}maxVal数组元素最大值*@param{number}bucketSize桶的大小,影响桶的数量*@returns{number[]......
  • 写一个方法实现“基数排序算法”,并解释下时间复杂度和空间复杂度
    functionradixSort(arr){if(!Array.isArray(arr)||arr.length<=1){returnarr;}//1.找到数组中的最大值,以确定最大位数letmax=Math.max(...arr);letexp=1;//1,10,100...//2.循环执行计数排序,从个位到最高位while(max/exp>=......
  • 写一个方法实现“选择排序算法”,并解释下时间复杂度和空间复杂度
    functionselectionSort(arr){constn=arr.length;for(leti=0;i<n-1;i++){//FindtheminimumelementintheunsortedpartofthearrayletminIndex=i;for(letj=i+1;j<n;j++){if(arr[j]<arr[minInd......
  • 写一个方法实现“交换排序算法”,并解释下时间复杂度和空间复杂度
    /***交换排序(冒泡排序)**@param{Array<number>}arr待排序的数组*@returns{Array<number>}排序后的数组*/functionexchangeSort(arr){constn=arr.length;letswapped;//优化:如果一趟没有交换,说明已经有序for(leti=0;i<n-1;i++){......
  • 【每日一题】209. 长度最小的子数组
    给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl,numsl+1,...,numsr-1,numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。示例1:输入:target=7,nums=[2,3,1,2,4,3]......
  • 顺序表的时间复杂度介绍
    顺序表的时间复杂度介绍引言顺序表(Array)是一种常见的数据结构,它在逻辑上是一种线性表,物理结构上是顺序存储。顺序表通过连续的内存空间存储数据元素,具有高效的随机访问特性。本文将详细介绍顺序表的增删改查操作的时间复杂度,并从最好、最坏和平均三个角度分析其性能表现。同时,我......
  • DDD之理解复杂度、尊重复杂度、掌控复杂度
    DDD之理解复杂度、尊重复杂度、掌控复杂度本文书接上回《懂了这个道理,人月神话不再是神话!》,关注公众号(老肖想当外语大佬)获取信息:最新文章更新;DDD框架源码(.NET、Java双平台);加群畅聊,建模分析、技术交流;视频和直播在B站。关注公众号一定要星标,以及时获得最新推送。背景关......
  • 算法渐进时间复杂度的比较
    算法渐进时间复杂度的比较与可接受范围在学习数据结构的第一章节中,我们经常会遇到一个关于算法渐进时间复杂度的比较结论:这个结论描述了不同时间复杂度函数在(N)趋于无穷大时的增长速率。本文将探讨这些时间复杂度的可接受范围,并解释哪些复杂度在实际应用中是可以接受的。......