我在想,如果下面的代码片段的时间复杂度为O(n^2)
:下面的代码片段O(n^2)的时间复杂度是多少?
class Solution {
public:
int numSquares(int n) {
if(n<=0)
return 0;
vector<int> dp(n+1, INT_MAX);
dp[0]=0;
for(int i=1; i<=n; i++) {
for(int j=1; j*j<=i; j++) {
//+1 because you are adding the current `j`
dp[i]=min(dp[i], dp[i-j*j]+1);
}
}
return dp[n];
}
};
我不知道,因为在内部循环,我们正在检查完全平方不到i
,这将是非常少与i
比较(我认为这么少,他们可以被认为是不变的)。在这种情况下,复杂性只会是O(n)
。那么,我可以说复杂性是O(n)
还是O(n^2)
?
注意:代码片段是LeetCode.com中的一个问题的解决方案,该问题显然具有一系列面试问题。
我要说的复杂性是'为O(n√N)' –
@PatrickRoberts,两个问题 - 'i'。怎么'O(n√n)'?和'ii'。你是如何插入该平方根符号的? –
外环为'O(N)',内环为'O(0.5√N)'。由于没有条件提前退出任一循环,所以只需将它们相乘以获得总体复杂度,然后降低系数,因为这些系数不属于大-O。在Mac上'√'的快捷键是'ALT + V' –