问题描述
时间复杂度:O(n) 谁能在数学上将时间复杂度解释为O(n)。 我发现 while 循环为O(logn)
public:
vector<vector<int>> levelOrder(Node* root) {
if(!root) return vector<vector<int>>{};
queue<Node*> q;
q.push(root);
vector<vector<int>> res;
while(!q.empty()){
//BFS traversal
int size= q.size();
vector<int> level;
for(int i= 0; i< size; i++){
auto tmp= q.front(); q.pop();
level.push_back(tmp->val);
for(auto n: tmp->children)
q.push(n);
}
res.push_back(level);
}
return res;
}
}
解决方法
那么您一次访问每个节点只有一次,所以这里的复杂度将是O(n)。这个问题不是“分而治之”的算法,因为wou最终将访问节点的所有分支(在二分算法中,您仅访问一个分支)。
编辑
递归算法的复杂性确实很棘手。这个公式可以帮助您:当您的时间复杂度为T(n)时,
T(n)= aT(n / b)+ f(n)。
如果f(n)=Θ(n d ),其中d≥0,则
-
如果a d ,
- T(n)=Θ(n d ) 如果a = b d ,则
- T(n)=Θ(n d * log(n)) 如果a> b d ,
- T(n)=Θ(n log b (a))
在您的情况下,f(n)=Θ(1),因为您在节点上什么也不做,所以d = 0。通常,您还具有a = b> 1,因此您处于第三种情况。 Log b (a)= 1,因为b = a,所以您的复杂度为Θ(n 1 )。