2017-09-16 181 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' –

相關問題