閱讀目錄
- 1. 題目
- 2. 解題思路
- 3. 代碼實現
1. 題目
2. 解題思路
此圖利用動態規劃進行求解,首先,我們求出小于 n n n 的所有完全平方數,存放在數組 squareNums
中。
定義 dp[n]
為和為 n n n 的完全平方數的最小數量,那么有狀態轉移方程:
d p [ n ] = m i n ( d p [ n ? s q u a r e N u m s [ i ] ] + 1 , d p [ n ] ) , 對于任意? s q u a r e N u m s [ i ] < n dp[n] = min(dp[n-squareNums[i]] + 1, dp[n]), 對于任意 \space squareNums[i] < n dp[n]=min(dp[n?squareNums[i]]+1,dp[n]),對于任意?squareNums[i]<n
d p [ n ] = 1 ,對于? s q u a r e N u m s [ i ] = = n dp[n] = 1,對于 \space squareNums[i] == n dp[n]=1,對于?squareNums[i]==n
3. 代碼實現
class Solution {
public:int numSquares(int n) {vector<int> squareNums;for (int i = 1; i < n; ++i) {if (i * i > n) {break;}squareNums.push_back(i * i);}vector<int> dp(n+1, 10000);dp[1] = 1;for (int i = 2; i <= n; ++i) {for (int j = 0; j < squareNums.size(); ++j) {if (squareNums[j] > i) {break;} else if (squareNums[j] == i) {dp[i] = 1;} else {dp[i] = min(dp[i], dp[i - squareNums[j]] + 1);} }}return dp[n];}
};
時間復雜度為 O ( n n ) O(n\sqrt{n}) O(nn?),第一層循環 n n n 次,第二層循環 n \sqrt{n} n? 次,空間復雜度為 O ( n ) O(n) O(n),其中 squareNums
占用空間為 O ( n ) O(\sqrt{n}) O(n?),也可以省略,直接在第二個循環得到 j ? j j*j j?j,dp
占用空間為 O ( n ) O(n) O(n)。