[LeetCode]279. Perfect Squares

来源:互联网 发布:一步之遥知乎 编辑:程序博客网 时间:2024/06/03 07:20

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.


思路:自己能想到的就是剪枝后的解空间搜索,虽然能AC但是时间复杂度太高

然后上网找到别人的动规方法,动规果真是难啊,代码简单但是难想出来,自己还需要做大量动规的题

动规的思路就是开辟一个n+1大小的数组,然后数组的下标为给出的数字n,数组的内容为n的最优平方和解,递推公式就是dp[i]=dp[i-j*j]+1

i为当前求最优解的数,也就是n,j为从1开始遍历到j*j小于等于i的数


解空间剪枝搜索代码:

public class Solution {    int res=Integer.MAX_VALUE;    public int numSquares(int n) {        get(n,0);        return res;    }        public void get(int n,int times){        if(n==0){            res=Math.min(times,res);            return;        }        if(times>=res||n<0){            return;        }        for(int i=(int)Math.sqrt(n);i>0;i--){            get(n-(int)Math.pow(i,2),times+1);        }    }}



动规代码:

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



0 0
原创粉丝点击