美文网首页动态规划
2019-01-06 leetcode279 完全平方数

2019-01-06 leetcode279 完全平方数

作者: 北子萌 | 来源:发表于2019-01-06 16:13 被阅读67次

Given a positive integern, find the least number of perfect square numbers (for example,1, 4, 9, 16, ...) which sum ton.

For example, givenn=12, return3because12 = 4 + 4 + 4; givenn=13, return2because13 = 4 + 9.

【题目分析】

一个数可以由一些完全平方数相加得到,例如1,4,9,16,...

给定一个数n,求出使得相加结果为n所需最少的完全平方数的个数。

【思路】

1. 递归

  对于一个数,我们怎么求它的由哪些完全平方数相加得到的呢?

  首先找到距离这个数最近的完全平方数m = x*x,我们从1~x中选择一个数,求出n中包含z个x*x,我们在递归求出n-z*x*x所包含的完全平方数。遍历1~x,返回其中最小的结果。

2. 动态规划

  动态规划用 dp[i] 数组存储第 i 个数的完美平方数。递推式为:dp[i] = Math.min(dp[j] + dp[i-j], dp[i]),认为 i 的完全平方数是从和为 i 的两个完全平方数 dp[j] 和 dp[i-j]之和,然后从中取最小。

 3. 改进后的动态规划

任何数字都可以表示成为一个普通数字加上一个完全平方数,因此有如下表格:


任何数的表示形式

 如图所示,红色部分表示平方数,所有的数都可以看做一个普通数加上一个完美平方数,那么递推式就变为了:dp[i + j * j] = Math.min(dp[i] + 1, dp[i + j * j])。

java递归实现:

public class Solution {

    public int numSquares(int n) {

        int count = n;

        int nearest = (int)Math.sqrt(n);

        if(n == 0) return 0;

        if(nearest*nearest == n) return 1;

        for(int i = nearest; i >= 1; i--) {

            int cur = 0, num  = n, t = i*i;

            while(num - t >= 0) {

                num -= t;

                cur++;

            }

            if(cur < count){

                count = Math.min(numSquares(num)+cur, count);

            }

        }

        return count;

    }

}

java 动态规划实现:

public class Solution {

    /*

    动态规划的思想来解决,递推公式dp[i] = Math.min(dp[j] + dp[i-j], dp[i])

    */

    public int numSquares(int n) {

        int[] array = new int[n+1];

        Arrays.fill(array, Integer.MAX_VALUE);

        array[1] = 1;

        for(int i = 2; i <=n; i++) {

            int sqr = (int)Math.sqrt(i);

            if(sqr*sqr == i) array[i] = 1;

            else{

                for(int j = 1; j <= i/2; j++) {

                    array[i] = Math.min(array[j]+array[i-j], array[i]);

                }

            }

        }

        return array[n];

    }

}、

改进的动态规划实现:

public class Solution {

    /*

    改进后动态规划,递推公式dp[i+j*j] = Math.min(dp[i]+1, dp[i+j*j])

    */

    public int numSquares(int n) {

        int[] array = new int[n+1];

        Arrays.fill(array, Integer.MAX_VALUE);

        for(int i = 1; i*i <= n; i++) {

            array[i*i] = 1;

        }

        for(int i = 1; i <= n; i++) {

            for(int j = 1; i+j*j <= n; j++) {

                array[i+j*j] = Math.min(array[i]+1, array[i+j*j]);

            }

        }

        return array[n];

    }

}

相关文章

  • 2019-01-06 leetcode279 完全平方数

    Given a positive integern, find the least number of perfe...

  • 完全平方数

    题目描述:给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需...

  • 完全平方数

    题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/perf...

  • 5-14完全平方数

    完全平方数就是: 两个相同的数相乘的数。 完全平方数的表示 A是完全平方数,通常用a的平方来表示。在学习了字母代替...

  • 判断完全平方数

    就是判断一个数字能不能被开平方, 比如9的开平方是3 是对的。 5没法开平方就是错的。 原理就是,开平方后判断是否...

  • 279. 完全平方数

    题目描述 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需...

  • 279. 完全平方数

    279. 完全平方数 1.思路 1.1动态规划: 这个题很容易就想到了动态规划.每次F[n]=min{F[i]+F...

  • 279. 完全平方数

    思路:才用广度优先搜索每次把 减去平方数的差值 和 搜索深度 入队遍历,第一次找到差值0时,对应的搜索深度即所求。...

  • 279. 完全平方数

    好久没有刷题了,还是要坚持和继续的,刷题是我快乐! 这个的思路就是一层一层的进行,在第一层用所有小于n的平方数去被...

  • leetcode-完全平方数

    这道题看着简单,但是自己没啥思路。 有三种方法 法一:动态规划,状态转移方程式 dp[i] = min(dp[i]...

网友评论

    本文标题:2019-01-06 leetcode279 完全平方数

    本文链接:https://www.haomeiwen.com/subject/xsmsrqtx.html