算法学习 | day34/60 不同路径/不同路径II

2024-04-03 21:44

本文主要是介绍算法学习 | day34/60 不同路径/不同路径II,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、题目打卡

        1.1 不同路径

       题目链接:. - 力扣(LeetCode)

       拿到手,首先见到答案需要求的是种类的个数,并且看题目,每次移动的时候只有两个方向,这也就说明,对于某一个位置来说,其状态转移的方向来自两个方向,上和左,并且看题,这个题目要求的是总共有多少路径,所以状态应该就是走到当前这个格子一共有多少路径。

(最后看了答案发现我写的有点不对,第一个那个位置应该是1)

        

        再画个图,发现其实这个递推的过程和楼梯一模一样,只是这个变成二维的了:

class Solution {
public:int uniquePaths(int m, int n) {if(m == 0 || n == 0) return 0;// if(m == 1 && n == 1) return 0;// if((m == 1 && n == 2) || (m == 2 && n == 1)) return 1;vector<vector<int>> dp(m+1,vector<int>(n+1,0));// vector<vector<int>> dp(vector<int>(0,m+1),n+1);// for(auto& i : dp){//     for(auto & j : i){//         cout << j << " ";//     }//     cout<<endl;// }// dp[1][1] = 0;// dp[1][2] = 1;// dp[2][1] = 1;for(int i = 1 ; i < m + 1;i++){for(int j = 1 ; j < n + 1 ; j++){if(i == 1 && j == 1){dp[1][1] = 1;continue;}if(i == 1 && j == 2){dp[1][2] = 1;continue;}if(i == 2 && j == 1){dp[2][1] = 1;continue;}// if(i == 1 && j == 2) continue;// if(i == 2 && j == 1) continue;dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}return dp[m][n];}
};

        我承认比答案写的冗余的多,但是我思路是没问题的😂。

        1.2 不同路径II

        题目链接:. - 力扣(LeetCode)

        拿到题目,第一感觉和上面感觉没什么区别,把障碍物当0不就可以了嘛😂,然后试了试:

class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {if(obstacleGrid[0][0] == 1) return 0;vector<vector<int>> dp(obstacleGrid.size(),vector<int>(obstacleGrid[0].size(),0));// 考虑这种案例,[[0,0],[1,1],[0,0]],如果初始化的时候遇到 障碍物了那么后面都是0for(int i = 0; i < obstacleGrid[0].size();i++){if(obstacleGrid[0][i] == 1){dp[0][i] = 0;break; // 必须要中断,因为这个后面的这个路已经被阻断了}else dp[0][i] = 1;}for(int i = 0; i < obstacleGrid.size();i++){if(obstacleGrid[i][0] == 1) {dp[i][0] = 0;break;}else dp[i][0] = 1;}// test// for(auto& i : dp){//     for(auto & j: i){//         cout << j << " ";//     }//     cout << endl;// }//[[1,0]] 这种案例就不会进入循环,所以要在前面处理for(int i = 1 ; i < obstacleGrid.size();i++){for(int j = 1 ; j < obstacleGrid[0].size();j++){if(obstacleGrid[i][j] == 1){dp[i][j] = 0;continue;}dp[i][j] = dp[i][j - 1] + dp[i - 1][j];}}return dp[obstacleGrid.size() - 1][obstacleGrid[0].size() - 1];}
};

        差不多调试了几次就通过了,还是有很多不一样的认知的,其实这里面主要是处理障碍物的两种方式,整体思路是遇到障碍物了以后,那个这个路段被阻断,所以就走不到这个位置,但是这里处理的方法在初始化和最后循环是不一样的,初始化的时候,遇到了障碍物,那么一定记住后面所有的都需要置零,而在递推循环中,遇到障碍物以后,是将这个位置的状态,也就是走到这里的路的个数变为0。

这篇关于算法学习 | day34/60 不同路径/不同路径II的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/874056

相关文章

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使

一文教你解决Python不支持中文路径的问题

《一文教你解决Python不支持中文路径的问题》Python是一种广泛使用的高级编程语言,然而在处理包含中文字符的文件路径时,Python有时会表现出一些不友好的行为,下面小编就来为大家介绍一下具体的... 目录问题背景解决方案1. 设置正确的文件编码2. 使用pathlib模块3. 转换路径为Unicod

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.