python求完全平方数最小数_leetcode279 完全平方数 python

题目

给定正整数n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于n。你需要让组成和的完全平方数的个数最少。

分析

首先,这道题目求解的是完全平方数的最小个数,那么要理解完全平方数的概念,比如1,4,9..... 所以如果是求个数最大值的话,就应该是输入的正整数本身n(因为1也是完全平方数)。

这道题目可以利用动态规划的思想解答(题目积累到一定程度就会自然而然感觉到),几乎所有的动态规划解决方案,首先会创建一个一维或多维数组DP矩阵来保存中间子问题的解,以及通常数组最后一个值代表最终解。那么这个矩阵是多少维度的呢?首先我们先寻找这道题的子问题,这也是动态规划的核心特征:问题可以拆分成子问题,而子问题的解被重复的使用。这个题是找某个数的完全平方数最小个数,那么拆分成子问题就是:当我找到一个比输入值小的完全平方数k后,那么剩余的值n-k作为新一轮的输入值,它的最优解+1就是n的最优解。然后不断循环此过程,最后求得最终解。那么我们其实就是在不断求解并更新比原始输入值小的正整数K的最优解,这样我们维护一个一维的数组就可以搞定了。但是这里要注意,我们子问题中的K一定也是一个完全平方数,否则没有意义,而n-k是不是完全平方数我们不用care,因为他只是作为新一轮的输入值,还需要继续拆分。那么问题来了,什么时候不能拆分呢?就是当k的平方大于n时,如果等于n,此时n-k=0。题意分析完毕后,

我们考虑下基本情况:1.每个正整数的最多完全平方数就是其本身的值 2.当输入的值为0时,其最优解也为0。最后,动态规划最重要的内容就是状态转移方程,那么我们如何用一种表达式来表示求得最优解的过程呢?子问题的解又是如何被重复利用的呢?这就是上面提到的一维数组dp。每个子问题的值肯定是小于上一轮的输入值的,所以我们预先计算好所有小于起始输入值的情况,并在每次遇到重复问题是进行查到使用就ok了:

通过上面的嵌套模式,我们就可以对每一个从1到n的值进行遍历。

而i减去j的平方就是剩余的子问题,那么状态转移方程就很好得出了:

注意别忘了在 dp[i - j*j] 后面加上1, 这个1就是一种完全平方数(j的平方)

答案

核心奥义

整数拆分 + 子问题求解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值