我在想,如果下面的代碼片段的時間複雜度爲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' –