1. 程式人生 > >LeetCode刷題Medium篇 Perfect Squares

LeetCode刷題Medium篇 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.

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都要求平方根