My Seventy-ninth Page - 完全平方数 - By Nicolas
创始人
2024-02-14 21:36:39

这篇page是针对leetcode上的279.完全平方数所写的。小尼先简单的说明一下这道题的意思,就是给出一个整数n,返回和为n的完全平方数的最小数量。

其实这道题就是一个典型的完全背包问题,我们可以把给出的整数n看作是背包容量的大小,给出的所有的完全平方数就是我们背包中需要放入的元素,我们在这里需要控制的一点就是我们如何将我们给入dp数组的范围控制好,其实也就是如何将我们的递归的条件控制好。

小尼接下来还是给出递归五部曲:

1、确定dp数组以及下标的含义:dp[j]是和为j的完全平方数的最少数量

2、确定递推公式:dp[j] = min(dp[j - i*i] + 1, dp[j])

3、dp数组如何初始化:dp[0]表示和为0的完全平方数的最小数量,那么dp[0]一定是0

4、确定遍历顺序:我们知道这是个完全背包,但是这道题我们需要求的只是一个数量,所以遍历的顺序也就是我们外层如何遍历以及内层如何遍历都是可以的,小尼等会给出两种遍历的写法

5、再就是导出dp数组

接下来,小尼将给出这道题的解体的代码:

class Solution {// 版本一,先遍历物品, 再遍历背包public int numSquares(int n) {int max = Integer.MAX_VALUE;int[] dp = new int[n + 1];//初始化for (int j = 0; j <= n; j++) {dp[j] = max;}//当和为0时,组合的个数为0dp[0] = 0;// 遍历物品for (int i = 1; i * i <= n; i++) {// 遍历背包for (int j = i * i; j <= n; j++) {if (dp[j - i * i] != max) {dp[j] = Math.min(dp[j], dp[j - i * i] + 1);}}}return dp[n];}
}
class Solution {// 版本二, 先遍历背包, 再遍历物品public int numSquares(int n) {int max = Integer.MAX_VALUE;int[] dp = new int[n + 1];// 初始化for (int j = 0; j <= n; j++) {dp[j] = max;}// 当和为0时,组合的个数为0dp[0] = 0;// 遍历背包for (int j = 1; j <= n; j++) {// 遍历物品for (int i = 1; i * i <= j; i++) {dp[j] = Math.min(dp[j], dp[j - i * i] + 1);}}return dp[n];}
}

上面就是两种循环交替解决的方法。

希望上面的分析和代码可以帮助到小伙伴们~~~

相关内容

热门资讯

鼓励放宽儿童免票身高年龄限制 转自:成都日报锦观鼓励放宽儿童免票身高年龄限制两部门联合印发意见 推进儿童友好建设 17日,国...
北京28项举措打造伙伴式营商环... (来源:千龙网)昨天(17日),深化“北京服务”赋能企业高质量发展新闻发布会举行。记者从会上获悉,本...
警惕盲盒消费的概率陷阱   柳婉婷  中国消费者协会近日发布消费提示,直指盲盒消费领域的重重陷阱。数据显示,2025年“全国...
北京四环主路健康工程17日晚全... (来源:千龙网)记者昨(17)日从市交通委获悉,3月17日晚,北京市四环主路(健翔桥东-四元桥南、十...
感受国医魅力 (来源:中国妇女报)转自:中国妇女报  3月17日,在山东省青岛市市北区桦川路幼儿园开展的“神奇中草...