代码随想录算法训练营第23期day45|70. 爬楼梯 (进阶)、322. 零钱兑换、279.完全平方数

news/2024/6/1 23:05:19 标签: 算法, leetcode, 动态规划

目录

leetcode%2070%EF%BC%89%E7%88%AC%E6%A5%BC%E6%A2%AF-toc" style="margin-left:0px;">一、(leetcode 70)爬楼梯

leetcode%20322%EF%BC%89%E9%9B%B6%E9%92%B1%E5%85%91%E6%8D%A2-toc" style="margin-left:0px;">二、(leetcode 322)零钱兑换

leetcode%20279%EF%BC%89%E5%AE%8C%E5%85%A8%E5%B9%B3%E6%96%B9%E6%95%B0-toc" style="margin-left:0px;">三、(leetcode 279)完全平方数


leetcode%2070%EF%BC%89%E7%88%AC%E6%A5%BC%E6%A2%AF" style="background-color:transparent;">一、(leetcode 70)爬楼梯

力扣题目链接​​​​​​

状态:查看思路后AC

除了常规的可以爬一或二级台阶,当题目稍微修改一下,变成可以爬m级台阶,之前的DP思路就有局限(dp[i] = dp[i-1] + dp[i-2),为了通杀这类问题,可以将题目转换为完全背包问题,可以爬的楼梯级数就是背包中的物品,楼梯总数就是背包,注意例如五级台阶1,2,2和2,2,1是不同的方法,所以类比昨天的组合总数问题,需要先遍历背包,再遍历物品、

class Solution {
public:
    int climbStairs(int n) {
        // 转换为完全背包问题
        vector<int> dp(n+1, 0);
        dp[0] = 1;
        for(int i = 1; i <= n; ++i){ // 先背包
            for(int j = 1; j <= 2; ++j){ // 后物品(可以爬的台阶数,题目中是2)
                if(i-j >= 0) dp[i] += dp[i-j];
            }
        }
        return dp[n];
    }
};

leetcode%20322%EF%BC%89%E9%9B%B6%E9%92%B1%E5%85%91%E6%8D%A2">二、(leetcode 322)零钱兑换

力扣题目链接

状态:查看思路Debug后AC。

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

leetcode%20279%EF%BC%89%E5%AE%8C%E5%85%A8%E5%B9%B3%E6%96%B9%E6%95%B0">三、(leetcode 279)完全平方数

力扣题目链接

状态:查看思路Debug后AC。

注意转换为完全背包后的先物品再背包和先背包再物品的遍历方式在实现上的细节问题,这里将两种代码都放上。

先物品,再背包:

class Solution {
public:
    int numSquares(int n) {
        // 完全平方数就是物品,总和就是背包,转换成一个无重复组合的完全背包问题
        vector<int> dp(n+1, INT_MAX);
        dp[0] = 0;
        for(int i = 1; i*i <= n; ++i){// 先物品
            for(int j = i*i; j <= n; ++j){
                dp[j] = min(dp[j], dp[j - i*i]+1);
            }
        }
        return dp[n];
    }
};

先背包,再物品:

class Solution {
public:
    int numSquares(int n) {
        // 完全平方数就是物品,总和就是背包,转换成一个无重复组合的完全背包问题
        vector<int> dp(n+1, INT_MAX);
        dp[0] = 0;
        for(int i = 0; i <= n; ++i){// 先背包
            for(int j = 1; j*j <= i; ++j){
                if(dp[i - j*j] != INT_MAX){
                    dp[i] = min(dp[i], dp[i - j*j]+1);
                }
            }
        }
        return dp[n];


http://www.niftyadmin.cn/n/5175853.html

相关文章

成都瀚网科技有限公司抖音带货正规

随着互联网的蓬勃发展&#xff0c;越来越多的公司开始利用网络平台进行产品销售。其中&#xff0c;抖音作为一款广受欢迎的短视频平台&#xff0c;已经成为众多商家眼中的“香饽饽”。在这场电商狂欢中&#xff0c;成都瀚网科技有限公司&#xff08;以下简称“瀚网科技”&#…

Clickhouse学习笔记(14)—— Clickhouse监控

ClickHouse 运行时会将一些个自身的运行状态记录到众多系统表中&#xff0c;如下所示&#xff1a; 为了直观方便地监控ck的运行情况&#xff0c;使用Prometheus Grafana 的组合来进行监控 Prometheus 负责收集各类系统的运行指标&#xff1b;Grafana 负责可视化 Prometheus&a…

PHP7使用C++扩展开发

Windows 使用【php-sdk-binary-tools】工具在windows下编译dll扩展。 php-sdk-binary-tools&#xff1a;GitHub - microsoft/php-sdk-binary-tools: Tool kit for building PHP under Windows 编译过程&#xff1a;php mb扩展 windows7,php7.4自定义扩展的编写Windows篇-CSD…

石英增强光声光谱气体传感技术中的高精密压力控制解决方案

摘要&#xff1a;光声池内气体压力的可调节控制以及稳定性是保证光声法高精度测量的关键&#xff0c;但在目前的光声和光谱研究中&#xff0c;对气体样品池内压力控制技术的报道极为简单&#xff0c;甚至很多都是错误的&#xff0c;根本无法实现高精度调节和控制&#xff0c;为…

逻辑的迷途-当简单的bug变成心灵之痛

每个程序员在其职业生涯中都有那些眼泪和微笑共存的时刻&#xff0c;其中一些时刻是因为那些令人抓狂的、一眼看不出来的错误。在这个充满0和1的世界里&#xff0c;一个小小的失误有时就像一颗隐藏的地雷&#xff0c;等待着无辜的代码手来踩上。 记得某一天&#xff0c;我坐在电…

推荐系统笔记--基于物品的协同过滤(Item CF)

1--基本原理 Item CF的原理是根据物品的相似度来将新的物品推荐给用户&#xff1b;下图中用户对红色物品的感兴趣度为 [2, 1, 4, 3]&#xff0c;红色物品与橙色物品的相似度为 [0.1, 0.4, 0.2, 0.6]&#xff0c;因此可以计算出用户对橙色物品的感兴趣度。 Item CF的基本思想是&…

全院级不良事件管理系统源码,事件上报、流转审批、数据统计、原因分析、措施制定

不良事件报告管理系统源码 事件上报、流转审批、数据统计、原因分析、措施制定 医院不良事件管理系统&#xff0c;支持医疗管理、护理管理、药品管理、医技管理、器械管理、输血管理、院感管理、职业防护管理、信息管理、后勤管理、治安管理等事件&#xff0c;内容齐全&#xf…

力扣双周赛 -- 117(容斥原理专场)

class Solution { public:long long c2(long long n){return n > 1? n * (n - 1) / 2 : 0;}long long distributeCandies(int n, int limit) {return c2(n 2) - 3 * c2(n - limit 1) 3 * c2(n - 2 * limit) - c2(n - 3 * limit - 1);} };