279. Perfect Squares

来源:互联网 发布:软件自动升级方案设计 编辑:程序博客网 时间:2024/05/17 01:24

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.

Credits:
Special thanks to @jianchao.li.fighter for adding this problem and creating all test cases.

新建dp[n+1]数组存放之前的每个n所需的最小square numbers,那么:

dp[0] = 0 dp[1] = dp[0]+1 = 1dp[2] = dp[1]+1 = 2dp[3] = dp[2]+1 = 3dp[4] = Min{ dp[4-1*1]+1, dp[4-2*2]+1 }       = Min{ dp[3]+1, dp[0]+1 }       = 1dp[5] = Min{ dp[5-1*1]+1, dp[5-2*2]+1 }       = Min{ dp[4]+1, dp[1]+1 }       = 2...dp[13] = Min{ dp[13-1*1]+1, dp[13-2*2]+1, dp[13-3*3]+1 }        = Min{ dp[12]+1, dp[9]+1, dp[4]+1 }        = 2...dp[n] = Min{ dp[n - i*i] + 1 },  n - i*i >=0 && i >= 1
根据上式 dp[0] = min(dp[n - j*j] + 1) 可以下代码如下:

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

0 0
原创粉丝点击