LeetCode Perfect Squares

279.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.

For example, given n = 12, return 3 because 12 = 4 + 4 + 4; given n = 13, return 2 because 13 = 4 + 9.

方法

动态规划题型

一开始使用暴力递归,过了46个样例就不行了,只能使用动态规划。 状态转换方程为

Math.min(dp[i],dp[i-j*j] + 1) {i - j*j >= 0}

解释: dp[i]表示对于给定的i需要多少个完美平方数。

如果一个数x可以表示为一个任意数a加上一个平方数bxb,也就是x=a + b * b,那么能组成这个数x最少的平方数个数,就是能组成a最少的平方数个数加上1(因为b*b已经是平方数了)。

public class Solution {
    public int numSquares(int n) {
        int[] dp = new int[n + 1];
        Arrays.fill(dp,Integer.MAX_VALUE);
        dp[0] = 0;
        for(int i = 1; i <= n; i++){
            for(int j = 1; i - j*j >= 0; j++){
                dp[i] = Math.min(dp[i],dp[i-j*j] + 1);
            }
        }
        return dp[n];
    }
}
Share