2017-09-16 147 views
1

我在想,如果下面的代码片段的时间复杂度为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中的一个问题的解决方案,该问题显然具有一系列面试问题。

+1

我要说的复杂性是'为O(n√N)' –

+0

@PatrickRoberts,两个问题 - 'i'。怎么'O(n√n)'?和'ii'。你是如何插入该平方根符号的? –

+1

外环为'O(N)',内环为'O(0.5√N)'。由于没有条件提前退出任一循环,所以只需将它们相乘以获得总体复杂度,然后降低系数,因为这些系数不属于大-O。在Mac上'√'的快捷键是'ALT + V' –

回答

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) + .... 
+0

哇!甚至没有想到这一点。你能指出一下'sqrt(i)'? –

+0

https://math.stackexchange.com/questions/1241864/sum-of-square-roots-formula –

+0

它不是“接近”,它是。作为N→∞',函数的时间成比例地增加到'N≠N' –

相关问题