我想知道以下代码段的时间复杂度是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的问题的解决方案,显然有一系列面试问题。
答案 0 :(得分:6)
外圈为O(N)
内循环是O(sqrt(i))
。
总和将是:
1 + sqrt(2) + ... + sqrt(N)
它大于O(N)
但小于O(N^2)
。
如果不对上述总和进行非常精确的计算,我会说,它接近O(N*sqrt(N))
。
<强>更新强>
从http://ramanujan.sirinudi.org/Volumes/published/ram09.pdf开始,上述总和为:
C1 + (2.0/3)*N*SQRT(N) + (1.0/2)*SQRT(N) + ....