算法学习——LeetCode力扣动态规划篇1(509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯、62. 不同路径、63. 不同路径 II)

news2024/11/28 0:42:18

算法学习——LeetCode力扣动态规划篇1

在这里插入图片描述

509. 斐波那契数

509. 斐波那契数 - 力扣(LeetCode)

描述

斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给定 n ,请计算 F(n) 。

示例

示例 1:

输入:n = 2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1

示例 2:

输入:n = 3
输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2

示例 3:

输入:n = 4
输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3

提示:

0 <= n <= 30

代码解析

迭代法
class Solution {
public:
    int fib(int n) {
        if(n <=1 ) return n;
        int pre0 = 0 , pre1 = 1;
        int num = n-2;

        while(num--)
        {
            int tmp = pre0 + pre1;
            pre0 = pre1;
            pre1 = tmp; 
        }

        return pre0+pre1;
    }
};

动态规划(DP)
class Solution {
public:
    int fib(int n) {
        if( n<=1 ) return n;
        vector<int> dp(n+1);
        dp[0]=0;
        dp[1]=1;

        for(int i = 2 ; i<dp.size();i++)
        {
            dp[i] = dp[i-1] + dp[i-2];
        }

        return dp[n];
    }
};

70. 爬楼梯

70. 爬楼梯 - 力扣(LeetCode)

描述

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例

示例 1:

输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。

  1. 1 阶 + 1 阶
  2. 2 阶

示例 2:

输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。

  1. 1 阶 + 1 阶 + 1 阶
  2. 1 阶 + 2 阶
  3. 2 阶 + 1 阶

提示

1 <= n <= 45

代码解析

动态规划

爬到第一层楼梯有一种方法,爬到二层楼梯有两种方法。
那么第一层楼梯再跨两步就到第三层 ,第二层楼梯再跨一步就到第三层。
所以到第三层楼梯的状态可以由第二层楼梯 和 到第一层楼梯状态推导出来,那么就可以想到动态规划了。

我们来分析一下,动规五部曲:

定义一个一维数组来记录不同楼层的状态

确定dp数组以及下标的含义
dp[i]: 爬到第i层楼梯,有dp[i]种方法

从dp[i]的定义可以看出,dp[i] 可以有两个方向推出来。

首先是dp[i - 1],上i-1层楼梯,有dp[i - 1]种方法,那么再一步跳一个台阶不就是dp[i]了么。

还有就是dp[i - 2],上i-2层楼梯,有dp[i - 2]种方法,那么再一步跳两个台阶不就是dp[i]了么。

那么dp[i]就是 dp[i - 1]与dp[i - 2]之和!

所以dp[i] = dp[i - 1] + dp[i - 2] 。

我相信dp[1] = 1,dp[2] = 2,这个初始化大家应该都没有争议的。

所以我的原则是:不考虑dp[0]如果初始化,只初始化dp[1] = 1,dp[2] = 2,然后从i = 3开始递推,这样才符合dp[i]的定义。

确定遍历顺序
从递推公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,遍历顺序一定是从前向后遍历的

class Solution {
public:
    int climbStairs(int n) {
        if(n<=2) return n;
        vector<int> dp(n+1);
        dp[1] = 1;
        dp[2] = 2;

        for(int i=3 ;i<dp.size() ; i++)
        {
            dp[i] = dp[i-1] + dp[i-2]; 
        }
        return dp[n];

    }
};

完全背包

可以转换为完全背包,求排序数的问题

目标值就是楼梯的高度n,价值就是步子的高度1,2

class Solution {
public:
    int climbStairs(int n) {

        vector<int> step = {1,2};
        vector<int> dp(n+1,0);
       
        dp[0]  = 1;
        //求排序数,先遍历背包,后遍历价值
        for(int j=0 ; j<=n  ;j++)
        {
            for(int i=0 ; i<step.size();i++)
            {
                if(j>=step[i])
                {
                    dp[j] += dp[j-step[i]];
                }
                else dp[j] = dp[j];
            }
                
        }
        return dp[n];
    }
};

746. 使用最小花费爬楼梯

746. 使用最小花费爬楼梯 - 力扣(LeetCode)

描述

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。

你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。

请你计算并返回达到楼梯顶部的最低花费。

示例

示例 1:

输入:cost = [10,15,20]
输出:15
解释:你将从下标为 1 的台阶开始。

  • 支付 15 ,向上爬两个台阶,到达楼梯顶部。
    总花费为 15 。

示例 2:

输入:cost = [1,100,1,1,1,100,1,1,100,1]
输出:6
解释:你将从下标为 0 的台阶开始。

  • 支付 1 ,向上爬两个台阶,到达下标为 2 的台阶。
  • 支付 1 ,向上爬两个台阶,到达下标为 4 的台阶。
  • 支付 1 ,向上爬两个台阶,到达下标为 6 的台阶。
  • 支付 1 ,向上爬一个台阶,到达下标为 7 的台阶。
  • 支付 1 ,向上爬两个台阶,到达下标为 9 的台阶。
  • 支付 1 ,向上爬一个台阶,到达楼梯顶部。
    总花费为 6 。

提示

2 <= cost.length <= 1000
0 <= cost[i] <= 999

代码解析

花最少的钱爬到楼顶
cost是在每一阶台阶,往上走的成本。

dp[i]的定义:到达第i个台阶所花费的最少体力为dp[i]。
可以有两个途径得到dp[i],一个是dp[i-1] 一个是dp[i-2]。因为最多走两步

即从 i-1台阶,花费cost(i-1) 到 i ;和 i-2台阶,花费cost(i-2) 到 i

dp数组如何初始化
dp[i]由dp[i-1],dp[i-2]推出,既然初始化所有的dp[i]是不可能的,那么只初始化dp[0]和dp[1]就够了,其他的最终都是dp[0]dp[1]推出。

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
       
        vector<int> dp(cost.size()+1); //要到楼顶,要比台阶数多一个
        dp[0] = 0; //从初始到第0个台阶,和第1个台阶花钱
        dp[1] = 0;
        for(int i=2 ; i<dp.size() ; i++) //从第二个台阶开始计算最小的成本
        {
            dp[i] = min(dp[i-2]+cost[i-2] , dp[i-1]+cost[i-1]);
        }
        return dp[cost.size()]; //到比台阶多一级,即到楼顶的最小成本
    }
};

62. 不同路径

62. 不同路径 - 力扣(LeetCode)

描述

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

问总共有多少条不同的路径?

示例

示例 1:
在这里插入图片描述

输入:m = 3, n = 7
输出:28
示例 2:

输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。

  1. 向右 -> 向下 -> 向下
  2. 向下 -> 向下 -> 向右
  3. 向下 -> 向右 -> 向下

示例 3:

输入:m = 7, n = 3
输出:28
示例 4:

输入:m = 3, n = 3
输出:6

提示

1 <= m, n <= 100
题目数据保证答案小于等于 2 * 109

代码解析

class Solution {
public:
    int uniquePaths(int m, int n) {
       
        if(m <= 1 || n<=1) return 1;
        vector<vector<int>> dp( m+1 , vector<int>(n+1,0));

        dp[1][1] = 1;
        dp[1][2] = 1;
        dp[2][1] = 1;

        for(int i=1 ; i<=m ; i++)
        {
            for(int j=1 ; j<=n ; j++)
            {   
                if(dp[i][j] != 0 ) continue;
                dp[i][j] = dp[i-1][j] + dp[i][j-1];
                // cout<<"i:"<<i<<" j:"<<j<<"   dp:"<<dp[i][j]<<endl;
            }
        }

        return dp[m][n];
    }
};

63. 不同路径 II

63. 不同路径 II - 力扣(LeetCode)

描述

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。

现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

网格中的障碍物和空位置分别用 1 和 0 来表示。

示例

示例 1:
在这里插入图片描述

输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
输出:2
解释:3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:

  1. 向右 -> 向右 -> 向下 -> 向下
  2. 向下 -> 向下 -> 向右 -> 向右

示例 2:
在这里插入图片描述

输入:obstacleGrid = [[0,1],[0,0]]
输出:1

提示

m == obstacleGrid.length
n == obstacleGrid[i].length
1 <= m, n <= 100
obstacleGrid[i][j] 为 0 或 1

代码解析

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        vector<vector<int>> 
        dp(obstacleGrid.size() , vector<int>(obstacleGrid[0].size() , 0));
        
        for(int i=0 ; i<obstacleGrid.size() ; i++)
        {
            for(int j=0 ; j<obstacleGrid[0].size() ;j++)
            {
                if(obstacleGrid[i][j] == 1) continue; //遇到障碍物绕开
                if(i==0 && j==0) dp[0][0] = 1; //起始点
                else if(i==0) dp[i][j] =  dp[i][j-1]; //最边行
                else if(j==0) dp[i][j] =  dp[i-1][j]; //最边列
                else dp[i][j] = dp[i-1][j] + dp[i][j-1]; 
            }
        }
        return dp[obstacleGrid.size()-1][obstacleGrid[0].size()-1];
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1562691.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mac - Keychron K3 Pro 功能键改键 -via 改键配置 For Mac

前言 Keychron K3 Pro键盘连接Mac使用&#xff0c;顶部一排功能键&#xff0c;默认是Mac的多媒体功能键。F1&#xff5e;F12功能键&#xff0c;需要按&#xff1a;Fn F1&#xff5e;F12。 而在我的日常工作中&#xff0c;常用的是F1&#xff5e;F12&#xff0c;期望F1~F12功…

SwiftUI Swift 显示隐藏系统顶部状态栏

Show me the code // // TestHideSystemTopBar.swift // pandabill // // Created by 朱洪苇 on 2024/4/1. //import SwiftUIstruct TestHideSystemTopBar: View {State private var isStatusBarHidden falsevar body: some View {Button {withAnimation {self.isStatusBa…

一文入门Ubuntu22

目录 1.安装Ubuntu22 2.常用目录 3.常用指令 1.sudo 超级用户权限运行命令 2.ls 罗列当前文件信息 3.文件目录相关&#xff1a; 1.cd改变工作路径&#xff1a; 2.pwd 3.创建目录和文件&#xff1a; 4.which 5.ps 6.kill 7.ping 4.用户相关 5.ssh与scp 6.服务相关…

宝塔面板 -- 打包前端项目并部署提升访问速度

文章目录 前言一、打包前端项目二、添加PHP项目三、部署打包文件四、开通防火墙五、运行网站总结 前言 在前面写到的文章使用宝塔面板部署前端项目中&#xff0c;并没有将前端项目打包而是直接部署&#xff0c;导致网站访问速度非常慢&#xff0c;加载甚至要十几秒。因此&…

HarmonyOS 应用开发之featureAbility接口切换particleAbility接口切换

featureAbility接口切换 FA模型接口Stage模型接口对应d.ts文件Stage模型对应接口getWant(callback: AsyncCallback<Want>): void; getWant(): Promise<Want>;ohos.app.ability.UIAbility.d.tslaunchWant: Want;startAbility(parameter: StartAbilityParameter, c…

照片变漫画怎么制作?3种方法教会你

照片变漫画怎么制作&#xff1f;在数字化时代&#xff0c;图片处理技术日新月异&#xff0c;将照片转化为漫画风格已成为一种流行的创意表达方式。这种转变不仅能让普通照片焕发新生&#xff0c;还能为我们的社交媒体和创作平台增添一抹独特的色彩。无论是为了记录生活点滴&…

【Linux】GFS分布式文件系统(一)

目录 背景GlusterFS 概述1.GlusterFS 简介2.GlusterFS 的特点扩展性和高性能高可用性全局统一命名空间弹性卷管理基于标准协议 3.GlusterFS 术语Brick&#xff08;存储块&#xff09;Volume&#xff08;逻辑卷&#xff09;FUSE&#xff08;Filesystem inUserspace&#xff09;V…

CV论文--2024.4.2

1、Unsolvable Problem Detection: Evaluating Trustworthiness of Vision Language Models 中文标题&#xff1a;无法解决的问题检测&#xff1a;评估视觉语言模型的可信度 简介&#xff1a;本文提出了一个新颖且重要的挑战&#xff0c;即视觉语言模型&#xff08;VLM&#x…

电梯四种事故检测YOLOV8

电梯四种事故检测&#xff0c;采用YOLOV8训练得到PT模型&#xff0c;然后转换成ONNX&#xff0c;OPENCV调用&#xff0c;支持C/PYTHON/ANDORID开发 电梯四种事故检测YOLOV8

Java | Leetcode Java题解之第6题Z字形变换

题目&#xff1a; 题解&#xff1a; class Solution {public String convert(String s, int numRows) {int n s.length(), r numRows;if (r 1 || r > n) {return s;}int t r * 2 - 2;int c (n t - 1) / t * (r - 1);char[][] mat new char[r][c];for (int i 0, x …

Network AIS Receiver R400N

目录 Introduction OVERVIEW BASIC FEATURES APPLICATIONS SPECIFICATIONS Introduction OVERVIEW The R400N provides a method of monitoring the position, speed and heading of AIS vessels within VHF range. It can decode of Class A, Class B, Aids to Navigat…

【游戏分析】FPS游戏自瞄爆头原理

众所周知 只要是射击类FPS类游戏都有自瞄爆头的功能 有的人会说,既然大家都知道,游戏公司也必然知道 那么为什么不把这个BUG修复掉呢 实际上并不是不修复,而是这个根本不算是BUG 为什么这么说呢? 原因很简单,手动可以射击,外挂也可以射击,手动射击是受肉眼影响准确度的,而…

高等数学基础篇(数二)之多元函数的微分法

多元函数微分法&#xff1a; 一、复合函数微分法 二、隐函数微分法 三、复合函数偏导数与全微分 四、隐函数偏导数与全微分 目录 一、复合函数微分法 二、隐函数微分法 三、复合函数偏导数与全微分 四、隐函数偏导数与全微分 一、复合函数微分法 二、隐函数微分法 补充…

了解游戏相关知识

个人笔记&#xff08;整理不易&#xff0c;有帮助点个赞&#xff09; 笔记目录&#xff1a;学习笔记目录_pytest和unittest、airtest_weixin_42717928的博客-CSDN博客 个人随笔&#xff1a;工作总结随笔_8、以前工作中都接触过哪些类型的测试文档-CSDN博客 目录 一&#xff1a…

如果医生向软件伪创新学习-UMLChina建模知识竞赛第5赛季第8轮

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 只要最先答对前3题&#xff0c;即可获得本轮优胜。 如果有第4题&#xff0c;第4题为附加题&am…

Ant Design Vue中的table与pagination的联合使用

效果&#xff1a; 代码&#xff1a; <a-table:dataSource"dataSource":columns"columns":pagination"pagination"change"handleTableChange":scroll"{ x: 100%, y: 600 }"> </a-table> export default defin…

物联网学习2、MQTT 发布/订阅模式介绍

MQTT 发布/订阅模式 发布订阅模式&#xff08;Publish-Subscribe Pattern&#xff09;是一种消息传递模式&#xff0c;它将发送消息的客户端&#xff08;发布者&#xff09;与接收消息的客户端&#xff08;订阅者&#xff09;解耦&#xff0c;使得两者不需要建立直接的联系也不…

【redis】MISCONF Redis is configured to save RDB snapshots报错解决方案

【redis】MISCONF Redis is configured to save RDB snapshots报错解决方案 大家好 我是寸铁&#x1f44a; 总结了一篇【redis】MISCONF Redis is configured to save RDB snapshots报错解决方案✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 今天在登录redis时&#xff0c…

环境配置——已解决ModuleNotFoundError: No module named ‘cv2’(python)

一、报错代码 在网上搜到不少用Python处理图形的代码&#xff0c;于是复制别人的代码直接运行却报错&#xff0c;得到的结果却是&#xff1a;已解决ModuleNotFoundError: No module named ‘cv2’。&#xff08;当时心里瞬间凉了一大截&#xff0c;最后顺利解决了&#xff0c;顺…

pandas ( day3)

一. Cov() 协方差 corr&#xff08;&#xff09;是 相关系数 &#xff0c;他将 协方差 cov 进一步压缩在 -1 ~ 1 之间 &#xff0c; 1 是正相关0 是不相干-1 是 负相关 A B C 0 68 95 66 1 99 87 67 2 87 87 91 3 59 87 72 4 59 91 79 5 82 88 50 6 88 74 85 7 95 67 72 8 …