LeetCode刷題Medium篇 Perfect Squares
阿新 • • 發佈:2019-01-03
題目
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.
十分鐘嘗試
看了討論區有人用dp解決,我來嘗試一下,感覺也是可以的,關鍵是分解問題,找到狀態轉化方程。來,嘗試一下。
dp[n]表示對於數字n,最少的完全平方數個數。
沒有總結出規律,看了其他人的解法,每次我們減去一個基本單元,也就是1,4,9,16等等,一直到n的平方根。總結出了規律,如下:
比如13
13=1+12
13=4+9
13=9+4
13=16XXXXXX---已經超出範圍,最多到n開方根
dp[n]=1+dp[n-j*j] 1=<j<=n平方根
來自己寫一下程式碼:
class Solution { public int numSquares(int n) { int[] dp=new int[n+1]; for(int k=1;k<=n;k++){ dp[k]=Integer.MAX_VALUE; } for(int i=1;i<=n;i++){ int sqrt=(int)Math.sqrt(i); for(int j=1;j<=sqrt;j++){ dp[i]=Math.min(dp[i],1+dp[i-j*j]); } } return dp[n]; } }
除錯過程有幾個錯誤點:
1 填充陣列,因為後面比較最小,所以用最大正整數填充。但是從1開始填充,不要包括dp[0],否則下面min比較的時候dp[i-j*j]=214838479 不是我們期待的,我們期待的時候dp[0]=0。
2 求平方根在n迴圈的裡面,不是外層,每個n都要求平方根