LeetCode 279: Perfect Squares

Perfect Squares

Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 16, ...) which sum to n.

For example, given n = 12, return 3 because 12 = 4 + 4 + 4; given n = 13, return 2 because 13 = 4 + 9.

解題思路

如果 x 是平方數,則返回 1 。否則可以將 x 表示爲一個任意數 a 加上一個平方數 b2 ,也就是 x=a+b2 ,那麼能組成 x 的最少平方數個數,就是能組成 a 的最少平方數個數加上 1 (因爲 b2 已經是平方數了)。

可以利用動態規劃(Dynamic Programming)求解該問題。令 dp[i] 表示組成 i 的最少平方數個數,初始化爲 dp[y2]=1 (其中 y2n ),狀態轉移方程爲 dp[x+y2]=min(dp[x+y2],dp[x]+1) 。時間複雜度爲 O(nlogn ,空間複雜度爲 O(n)

代碼如下:

class Solution {
public:
    int numSquares(int n) {
        int dp[n+1];
        // 將所有非平方數的結果置最大
        fill(dp, dp + n + 1, INT_MAX);
        for (int i = 0; i * i <= n; ++i) {
            // 將所有平方數的結果置1
            dp[i * i] = 1;
        }

        for (int i = 0; i <= n; ++i) {
            for (int j = 0; i + j * j <= n; ++j) {
                // 注意 a + b*b 本身就是平方數
                dp[i + j * j] = min(dp[i] + 1, dp[i + j * j]);
            }
        }

        return dp[n];
    }
};
發佈了62 篇原創文章 · 獲贊 5 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章