1. 程式人生 > >[leetcode] Perfect Squares

[leetcode] Perfect Squares

1、題目

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

Example 1:

Input: n = 12
Output: 3 
Explanation: 12 = 4 + 4 + 4.

Example 2:

Input: n = 13
Output: 2
Explanation: 13 = 4 + 9.

2、分析

這個題也是網上找了答案並理解。好像是個很經典的問題,然後這裡介紹動態規劃解法。設定一個一維陣列dp[n+1],dp[i]表示整數i最少由多少個平凡數構成。具體解釋的話放到程式碼的註釋部分吧。

3、程式碼

class Solution {
public:
    int numSquares(int n) {
        //首先設定一個數組,把所有的數字調到最大,方便後面的更新。
       //有個定理叫四平方數定理,就是每個正整數最後由4個平方數構成。所以這裡初始化為比4大的數就可以
        vector<int> dp(n + 1, INT_MAX);
        //陣列第一個為止初始化為0.
        dp[0] = 0;
        //對於從0到n的每個數,計算該數加一個平方數,比如我們知道1最少由1個平方數構成,
        //那麼1+2^2 = 5,所以5最少由兩個平方數構成。
        //思想就是已知當前數的最小平方數個數,再加一個平方數,得知那個數的最小平方數個數
        for (int i = 0; i <= n; ++i) {
            for (int j = 1; i + j * j <= n; ++j) {
                //一個數有不知一種平方陣列成方法,我們永遠取最小的組成個數
                dp[i + j * j] = min(dp[i + j * j], dp[i] + 1);
            }
        }
        return dp.back();
        
    }
};