javascript - 如何编写时间复杂度较低的代码来查找给定数组范围内丢失的元素?

标签 javascript performance time-complexity big-o

我的函数应该返回给定数组范围内缺失的元素。 所以我首先对数组进行排序并检查 i 和 i+1 之间的差值是否不等于 1,我将返回缺少的元素。

// Given an array A such that:
// A[0] = 2
// A[1] = 3
// A[2] = 1
// A[3] = 5
// the function should return 4, as it is the missing element.

function solution(A) {
  A.sort((a,b) => {
    return b<a;
  })
  var len = A.length;
  var missing;
  for( var i = 0; i< len; i++){
    if( A[i+1] - A[i] >1){
      missing = A[i]+1;
    }
  }
  return missing;
}

我确实喜欢上面的,但是如何更有效地编写它呢??

最佳答案

您可以通过使用一组缺失值来使用单循环方法。

在循环中,删除缺失集中的每个数字。

如果找到新的最小值,所有缺失的数字都会添加到缺失数字集中(最小值除外)以及新的最大值。

缺失数字集最后包含结果。

function getMissing(array) {
    var min = array[0],
        max = array[0],
        missing = new Set;
    
    array.forEach(v => {
        if (missing.delete(v)) return;                   // if value found for delete return
        if (v < min) while (v < --min) missing.add(min); // add missing min values
        if (v > max) while (v > ++max) missing.add(max); // add missing max values
    });
    return missing.values().next().value;                // take the first missing value
}

console.log(getMissing([2, 3, 1, 5]));
console.log(getMissing([2, 3, 1, 5, 4, 6, 7, 9, 10]));
console.log(getMissing([3, 4, 5, 6, 8]));

关于javascript - 如何编写时间复杂度较低的代码来查找给定数组范围内丢失的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50942303/

相关文章:

javascript - 用于隐藏按钮的 xpages javascript 代码

javascript - 在 Recurly JS 字段上设置最大长度

javascript - 如果找不到内容,则折叠 HTML

python - 在 Python 中创建嵌套列表的时间复杂度

javascript - NextJS : How can I use a loading component instead of nprogress?

c# - C# 中的 RawFraction 性能计数器

c - 为什么编译器不能(或不)将可预测的加法循环优化为乘法?

php - 是否避免加入?

algorithm - O(klogk) 时间算法从二叉堆中找到第 k 个最小元素

algorithm - 几种算法的总体复杂度是多少?