下面的片段O(n ^ 2)的时间复杂度是多少?

时间:2017-09-16 19:26:22

标签: c++ time-complexity

我想知道以下代码段的时间复杂度是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的问题的解决方案,显然有一系列面试问题。

1 个答案:

答案 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) + ....