LeetCode OJ 279 Perfect Squares [Medium]

来源:互联网 发布:世界国家城市数据库 编辑:程序博客网 时间:2024/06/08 19:55

题目描述:

Given a positiveinteger 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.

题目理解:

给定一个正整数n,该正整数等于x个完全平方数的和,返回最小的x

完全平方数:1,4,9,16,25……

题目分析:

1.  n 总是等于n1+i1*i1,而n1也可以写成n2+i2*i2的形式;那么numSquares(n) = numSquares(n1)+1,numSquares(n1) = numSquares(n2)+1;

2.  首先想到用循环+递归的方法,依次尝试i,每次返回的是min(result,numSquares(n - i*i) + 1),极限情况是n=1时返回1,n=0时返回0;但这种方法超时;

3.  同样是想法1,n的结果依赖于比n小的其他数的结果,因此将小于等于n的所有数的输出结果都计算出来,存入一个数组中,这样减少了2的循环,缩短时间;

4.  还有其他方法,见博客http://www.cnblogs.com/grandyang/p/4800552.html

解答一超时

public static int numSquares(int n) {    if(n == 1)return 1;    if(n == 0)return 0;    int res =n;    for(int i = 1; i * i <= n; i++){        res = Math.min(res, numSquares(n- i*i) + 1);    }    return res;}
解答二(对解答一的改进):

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


 

 

原创粉丝点击