Day45 | 70. 爬楼梯 (进阶), 322. 零钱兑换, 279.完全平方数

news/2024/10/31 5:34:40/

Day45 | 70. 爬楼梯 (进阶), 322. 零钱兑换, 279.完全平方数

爬楼梯(进阶)

LeetCode题目:https://leetcode.cn/problems/climbing-stairs/

  爬楼梯问题现在可以抽象成一个完全背包的排列问题。因为每次指定上一个台阶或者两个台阶,所以可以看成有两个分别重量和价值均为1,2的物品可以反复取用。台阶即为背包的容量。

  因此,由以上推理,问题可以化为:当可以取到x的台阶容量时,有多少种方法组成。即此时dp的容量上限为x,dp[i]意为容量为x时最多有多少种组合方法。所以递推公式为dp[j] += dp[j - nums[i]];

  最终两次循环第一轮循环背包容量,第二轮循环物品价值,代码如下:

class Solution {
public:int climbStairs(int n) {if(n==1) return 1;vector<int> dp(n+1,0);dp[1] = 1;dp[2] = 2;for (int i = 3;i <= n;i++) {for(int j = 1; j <= 2; j++) {dp[i] += dp[i - j];}}return dp[n];}
};

零钱兑换

LeetCode题目:https://leetcode.cn/problems/coin-change/

  该问题与零钱兑换ii不同的是只求所需要的硬币数量,而不在乎硬币的种类组合等。因此完全背包的循环顺序先背包还是先物品容量均可。如果要组合则只能先物品容量循环。

  因此,还是求最小装满数量,所以dp数组代表容量为i的时候装满所需要的最小数量。递推公式可得为dp[j] = min(dp[j-coins[i]] + 1,dp[j])。由于涉及到最小值计算,则dp里面数值应该初始化为INT_MAX。并在每次循环是判定,如果dp[j-coins[i]]==INT_MAX,则意味着之前的dp[j-coins[i]]就没有办法装满,因此后续也无法装满。当循环结束,如果dp[amount] == INT_MAX则说明无法装满,所以置为-1.

  最终两次循环,代码如下:

class Solution {
public:int coinChange(vector<int>& coins, int amount) {vector<int> dp(amount + 1, INT_MAX);dp[0] = 0;for (int i = 0; i < coins.size(); i++) {for (int j = coins[i]; j <= amount; j++) {if (dp[j - coins[i]] == INT_MAX) continue;dp[j] = min(dp[j - coins[i]] + 1, dp[j]); }}if(dp[amount] == INT_MAX) dp[amount] = -1;return dp[amount];}
};

完全平方数

LeetCode题目:https://leetcode.cn/problems/perfect-squares/

  该问题与零钱兑换类似,只不过物品价值信息没有提前给出,而是需要循环时候自己判定完全平方数的存在。同时因为是求装满的最小数量,不需要纠结循环顺序,因此为了方便,可以将物品价值作为外循环,进行平方数判定。同时平方数的上限可以由n的边界得到。

  因此,还是求最小装满数量,所以dp数组代表容量为i的时候装满所需要的最小数量。递推公式可得为dp[j] = min(dp[j-i] + 1,dp[j])。由于涉及到最小值计算,则dp里面数值应该初始化为INT_MAX。并在每次循环是判定,如果dp[j-i]==INT_MAX,则意味着之前的dp[j-i]就没有办法装满,因此后续也无法装满。但因为1也是完全平方数,所以基本不会有影响。

  最终两次循环,代码如下:

class Solution {
public:int numSquares(int n) {vector<int> dp(n + 1, INT_MAX);dp[0] = 0;for (int i = 1; i < 1e4 + 1; i++) {int a = (int)sqrt(i);if (a * a == i) {for (int j = i; j <= n; j++) {if(dp[j - i] == INT_MAX) continue;dp[j] = min(dp[j - i] + 1, dp[j]);}}}return dp[n];}
};

http://www.ppmy.cn/news/548491.html

相关文章

MyDockFinder深度还原MacOS系统风格工具

前言 之前通过修改主题与Curtains Styles实现了Windows整体的MAC风格以及圆角效果 但这样也只是有一点形似而已&#xff0c;差的还很多 不过最近小编又找到了一款工具&#xff0c;终于可以极致模拟MacOS系统体验了 它能够深度还原MacOS的Finder与Dock栏效果以及消息提示、动…

如何使用Ghost备份与还原操作系统

备份系统 完成操作系统、驱动程序或所需软件的安装后&#xff0c;可以利用 Ghost 工具将系统分区“复制”到一个镜像文件中&#xff0c;在系统出现问题时再将镜像文件还原到系统盘即可&#xff0c;还原时所需的时间也只有 10分钟左右&#xff0c;既方便又快捷。使用 Ghost 备份…

Linux系统备份与还原

Linux系统备份与还原 1. 整盘备份与还原 1.1. 记住几个这里要经常用到操作1.2. 整盘克隆的方法 2. [推荐]非整盘克隆的方法 2.1. 备份系统2.2. 还原系统 1. 整盘备份与还原 1.1. 记住几个这里要经常用到操作 * 查看存储设备&#xff08;硬盘、U盘、磁盘分区&#xff09;的使…

普通单目相机标定——准备工作

前言 这里我们还是以普通相机为例(非鱼眼相机)来进行后续的相关标定操作,再回顾下相机的成像模型如下所示。 已知相机内参(fx,fy,u0,v0),畸变系数[k1,k2,k3,p1,p2],相机外参[R|T]。世界坐标系中点Pw(Xw,Yw,Zw),投影至像素坐标系点p(u,v)的计算过程如下。 1)由世…

电脑桌面云便签怎么设置分类宽度?

支持多端同步功能的云服务便签支持Windows电脑桌面PC版使用。该云便签支持设置多项分类标签&#xff0c;且分类标签栏支持设置分类宽度。那么电脑版桌面云便签应该怎么设置分类宽度呢&#xff1f; 一、打开已登录的电脑版桌面云便签&#xff0c;点击上方用户头像&#xff0c;或…

Win10便签在哪?Win10桌面便签怎么打开和使用?

Win10系统是主流办公系统之一&#xff0c;系统有许多自带的小工具&#xff0c;可以帮助用户处理工作中遇到的麻烦。如果用户在工作中&#xff0c;想把待办事项记录下来&#xff0c;就可以在win10桌面便签上记录。Win10系统是有自带的便签的&#xff0c;那么win10便签在哪&#…

敬业签桌面便签怎么设置桌面固定?

一、打开已登录的敬业签电脑版桌面便签软件&#xff0c;点击上方用户头像&#xff0c;或者按下默认快捷键AltZ&#xff0c;也可以在云便签右上方找到“设置”>“设置”&#xff0c;进入系统设置页面&#xff1b; 二、在系统设置界面左侧点击“基本设置”&#xff0c;在基本设…

电脑桌面云便签怎么调整界面大小?

支持多端同步功能的云便签支持Windows电脑PC版使用。电脑版用户注册并登录该云便签主页面之后&#xff0c;默认显示的内容界面较长。如果需要调整Windows电脑版桌面云便签的界面大小&#xff0c;应该怎么操作呢&#xff1f; 一、打开已登录的电脑版桌面云便签软件&#xff1b;…