代码随想录算法训练营第三十九天|62.不同路径 63. 不同路径 II

news/2025/3/26 13:53:22/

目录

LeeCode 62.不同路径 

深度搜索法

动态规划法

数论方法

LeeCode 63. 不同路径 II 


LeeCode 62.不同路径 

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

深度搜索法

思路:机器人走过的路径可以抽象为一棵二叉树,而叶子节点就是终点,此时问题就可以转化为求二叉树叶子节点的个数。

代码:

class Solution {
private:int dfs(int i, int j, int m, int n) {if (i > m || j > n) return 0;if (i == m && j == n) return 1;return dfs(i + 1, j, m ,n) + dfs(i, j + 1, m, n);}
public:int uniquePaths(int m, int n) {return dfs(1, 1, m, n);}
};

动态规划法

思路

1.确定dp数组及下标含义:dp[i][j]:表示从(0,0)出发,到(i, j) 有dp[i][j]条不同的路径

2.确定递推公式:由题目可知,dp[i][j] = dp[i - 1][j] + dp[i][j - 1];

3.dp数组如何初始化:dp[i][0] = 1,dp[0][j] = 1;

4.确定遍历顺序:从左到右

5.举例递推dp数组

代码

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

数论方法

思路:从起点走到终点共有 m + n - 2 步,其中一定有 m - 1步要向下走。转化为,m + n - 2个不同的数中取m - 1个数的取法个数。

注意:求组合的时候,要防止两个int相乘溢出。 不能把算式的分子和分母都算出来再做除法,而是要在计算分子的时候,不断除以分母。

代码

class Solution {
public:int uniquePaths(int m, int n) {long long numerator = 1; //分子 long denominator = m - 1;//分母 int count = m - 1;int t = m + n - 2;while(count--) {numerator *= (t--);while (denominator != 0 && numerator % denominator == 0){numerator /= denominator;denominator--;}}return numerator;}
};

LeeCode 63. 不同路径 II 

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

思路

1.确定dp数组及下标含义:dp[i][j]:表示从(0,0)出发,到(i, j) 有dp[i][j]条不同的路径

2.确定递推公式:由题目可知,dp[i][j] = dp[i - 1][j] + dp[i][j - 1](无障碍时)

3.dp数组如何初始化:

vector<vector<int>> dp(m, vector<int>(n, 0));
for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++) dp[i][0] = 1;
for (int j = 0; j < n && obstacleGrid[0][j] == 0; j++) dp[0][j] = 1;

4.确定遍历顺序:从左到右

5.举例递推dp数组

代码

class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int m = obstacleGrid.size();int n = obstacleGrid[0].size();//如果在起点或终点出现障碍,直接返回0 if (obstacleGrid[m - 1][n - 1] == 1 || obstacleGrid[0][0] == 1) {return 0;}vector<vector<int>> dp(m, vector<int>(n, 0));for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++) dp[i][0] = 1;for (int j = 0; j < n && obstacleGrid[0][j] == 0; j++) dp[0][j] = 1;for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {if (obstacleGrid[i][j] == 1) continue;dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}} return dp[m - 1][n - 1];}
};

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

相关文章

20230530----重返学习-redux工程化-react-redux-高阶组件

day-081-eighty-one-20230530-redux工程化-react-redux-高阶组件 redux工程化 redux工程化就是模块化开发。 工程化步骤 redux工程化的第一种方式&#xff1a;拆分和合并reducer。 把各个可以状态集群reducer独立放到单个js文件中。使用combineReducers合并拆分出去的reduce…

【Leetcode -746.使用最小花费爬楼梯 -747.至少是其他数字两倍的最大数】

Leetcode Leetcode -746.使用最小花费爬楼梯Leetcode -747.至少是其他数字两倍的最大数 Leetcode -746.使用最小花费爬楼梯 题目&#xff1a;给你一个整数数组 cost &#xff0c;其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择…

黑马Redis视频教程实战篇(三)

目录 一、优惠券秒杀 1.1 全局唯一ID 1.2 Redis实现全局唯一ID 1.3 添加优惠卷 1.4 实现秒杀下单 1.5 库存超卖问题分析 1.6 代码实现乐观锁解决超卖问题 1.7 优惠券秒杀-一人一单 1.8 集群环境下的并发问题 二、分布式锁 2.1 基本原理和实现方式对比 2.2 Redis分布…

gradle的例子

以下是一个详细的Gradle示例代码&#xff0c;用于构建和管理Java项目&#xff1a; build.gradle文件&#xff1a; plugins {id java }group com.example version 1.0-SNAPSHOTsourceCompatibility 1.8repositories {mavenCentral() }dependencies {implementation org.apach…

C++ set类成员函数介绍 (set和multiset)

目录 &#x1f914;set模板介绍&#xff1a; &#x1f914;特点&#xff1a; &#x1f914;set的成员函数&#xff1a; &#x1f60a;set构造函数&#xff1a; &#x1f50d;代码实例&#xff1a; &#x1f50d;运行结果&#xff1a; &#x1f60a; set赋值函数&#xf…

Hive窗口函数详细介绍

文章目录 Hive窗口函数概述样本数据表结构表数据 窗口函数窗口聚合函数count()SQL演示 sum()SQL演示 avg()SQL演示 min()SQL演示 max()SQL演示 窗口分析函数first_value() 取开窗第一个值应用场景SQL演示 last_value()取开窗最后一个值应用场景SQL演示 lag(col, n, default_val…

MySQL第二章、数据库基础

回顾&#xff1a; 目录 一、数据库的操作 1.1创建数据库 1.2显示当前数据库 1.3使用数据库 1.4删除数据库 二、常用数据类型 2.1数值类型&#xff08;分为整型和浮点型&#xff09; 2.2字符串类型 2.3 日期类型 三、表的操作 ​编辑 3.1创建表 3.2查看表结构 ​编…

二进制算法题+回文链表

文章目录 一、剑指 Offer II 002. 二进制加法二、693. 交替位二进制数三、剑指 Offer 15. 二进制中1的个数四、剑指 Offer II 027. 回文链表总结 一、剑指 Offer II 002. 二进制加法 先计算两个字符串公共的部分&#xff0c;需要维护三个变量&#xff1a;两个数组的指针idx一个…