[leetcode] Perfect Squares
阿新 • • 發佈:2018-11-04
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(); } };