Leetcode 题目解析:279. 完全平方数
系列文章:
一 摘要
一道典型的动态规划题目,虽然之前在算法题目解析:从一道题目看动态规划中介绍过了动态规划的原理、应用场景和题目示例,不过也并不是所有人都能熟练掌握(比如我自己...)。
二 题目描述
引用leetcode的描述原文如下:
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
给你一个整数 n ,返回和为 n 的完全平方数的 最少数量 。
完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。
限制条件:1 <= n <= 104
三 题目解析
3.1 示例
示例 1:
复制代码
对照题目,12 由 3 个平方数:4 加和得到,所以完全平方数的最少数量是 3,故输出为 3.
3.2 动态规划解法
既然是典型的动态规划问题,就先考虑动态规划解决。最重要的也就是定义状态转移方程了。f[i] 表示最少需要多少个数的平方来表示整数 i。f[i]的取值一定会是在 [1, √n]之间,这是有限的整数,也就是可以枚举的。
状态转移方程:
边界条件,也就是当 i=0 时,f[0]=0 ,实际上我们无法表示数字 0,只是为了保证状态转移过程中遇到 j 恰为√i 的情况合法。
Java 版代码如下:
复制代码
版权声明: 本文为 InfoQ 作者【程序员架构进阶】的原创文章。
原文链接:【http://xie.infoq.cn/article/beeefe66603db8103f8a08e26】。文章转载请联系作者。
评论