繁体   English   中英

关于JavaScript代码时间复杂度的问题

[英]Question about JavaScript Code Time Complexity

var findDisappearedNumbers = function(nums) {
    
    const numberSet = new Set();

    for(let i = 1; i < nums.length + 1; i++) {
        numberSet.add(i);
    }

    nums.forEach((element) => {
        if(numberSet.has(element)) {
            numberSet.delete(element);
        }
    });

    return Array.from(numberSet);
};

以上是 leetcode 问题 448 的解决方案。 https://leetcode.com/problems/find-all-numbers-disappeared-in-an-array/description/

显然程序的时间复杂度是O(n)。 这是我不明白的,不应该是 O(n^2) 因为你迭代 nums 一次来填充 numberSet,然后你再次迭代 nums 来检查重复项吗?

所以 for 循环和 nums.forEach 都是 O(n) 使得它整体 O(n^2)?

时间复杂度是 O(N) 而不是 O(n^2),因为你将 nums 迭代了两次,这意味着时间复杂度是 O(2N),你可以将其简化为 O(N)。 如果您在 nums 的迭代中迭代 nums,则时间复杂度将为 O(n^2),例如:

for(let i = 1; i < nums.length + 1; i++) {
   for(let j = 1; j < nums.length + 1; j++){
      // code
   }
}

希望这可以帮助

由于有两个循环,时间复杂度在技术上是 O(2n)。 然而,通过渐近分析,我们舍弃了常系数和次要项。 所以 O(2n) 等价于 O(n)。

如果循环是嵌套的,则运行时间将为 O(n^2)。 例如:

for (let i = 1; i < nums.length; i++) {
  for (let j = i + 1; j < nums.length; j++) {
    // Do something
  }
}

这个解决方案很容易理解;

var findDisappearedNumbers = function (nums) {
  const numberSet = new Set(nums);

  let result = [];

  for (let i = 1; i < nums.length + 1; i++) {
    if (!numberSet.has(i + 1)) {
      result.push(i);
    }
  }

  return result;
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM