LeetCode解題報告 279. Perfect Squares [medium]

conniemessi發表於2016-12-17

題目描述

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如果可以表示成a+b*b,那麼最後所求的結果就是組成a所需要的平方數的個數再加1。
狀態轉移方程為dp[a+b*b]=min(dp[a]+1, dp[a+b*b])。
將一個長度為x的陣列,完全平方數初始化為1,其餘數初始化為無窮大,如果一個數是完全平方數,那麼返回的值就是它本身,也就是1;如果一個數不是完全平方數,那麼返回的值就是dp[a]+1,因為此時dp[a+b*b]是無窮大。

程式碼如下:
class Solution {
public:
    int numSquares(int n) {
        int dp[n+1];
        for (int i=0; i<n+1; i++) {
            dp[i]=INT_MAX;
        }
        for (int i=0; i*i<=n; i++) {
            dp[i*i]=1;
        }
        for (int i=0; i<=n; i++) {
            for (int j=0; i+j*j<=n; j++) {
                dp[i+j*j]=min(dp[i]+1,dp[i+j*j]);
            }
        }
        return dp[n];
        
    }
};

時間複雜度
O(N)*O(sqrt(N))



相關文章