【问题标题】:Question about JavaScript Code Time Complexity关于 JavaScript 代码时间复杂度的问题
【发布时间】:2023-01-12 21:18:00
【问题描述】:
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 * O(n) ,这是 O(n)

标签: javascript time


【解决方案1】:

时间复杂度是 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
   }
}

希望这可以帮助

【讨论】:

    【解决方案2】:

    由于有两个循环,时间复杂度在技术上是 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
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多