[英]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.