Skip to content

Latest commit

 

History

History
140 lines (107 loc) · 5.98 KB

0062.md

File metadata and controls

140 lines (107 loc) · 5.98 KB
title description keywords
62. 不同路径
LeetCode 62. 不同路径题解,Unique Paths,包含解题思路、复杂度分析以及完整的 JavaScript 代码实现。
LeetCode
62. 不同路径
不同路径
Unique Paths
解题思路
数学
动态规划
组合数学

62. 不同路径

🟠 Medium  🔖  数学 动态规划 组合数学  🔗 力扣 LeetCode

题目

There is a robot on an m x n grid. The robot is initially located at the top-left corner (i.e., grid[0][0]). The robot tries to move to the bottom-right corner (i.e., grid[m - 1][n - 1]). The robot can only move either down or right at any point in time.

Given the two integers m and n, return the number of possible unique paths that the robot can take to reach the bottom-right corner.

The test cases are generated so that the answer will be less than or equal to 2 * 10^9.

Example 1:

Input: m = 3, n = 7

Output: 28

Example 2:

Input: m = 3, n = 2

Output: 3

Explanation: From the top-left corner, there are a total of 3 ways to reach the bottom-right corner:

  1. Right -> Down -> Down

  2. Down -> Down -> Right

  3. Down -> Right -> Down

Constraints:

  • 1 <= m, n <= 100

题目大意

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?

解题思路

可以使用动态规划来解决问题,机器人到达每个格子的路径数如下所示:

❤️ 1 1 1 1 1 1
1 2 3 4 5 6 7
1 3 6 10 15 21 28
  1. 动态规划:定义一个二维数组 dp,其中 dp[i][j] 表示从 (0, 0)(i, j) 的不同路径数目。

  2. 状态转移方程:从 (0, 0)(i, j) 的路径有两条:从 (i-1, j) 向下移动和从 (i, j-1) 向右移动,到达 (i, j) 的路径数就是上方格子 (i-1, j) 和左边格子 (i, j-1) 的路径数之和。状态转移方程为 dp[i][j] = dp[i-1][j] + dp[i][j-1]

  3. 边界条件:对于第一行和第一列,由于它们只能从上方或左侧移动到达,所以路径数目都是 1。

  4. 初始化:初始化第一行和第一列的路径数目。

复杂度分析

  • 时间复杂度: O(m * n),遍历整个二维数组。
  • 空间复杂度: O(m * n),使用了一个二维数组来存储中间状态。可以优化为 O(n),只需使用一维数组来存储当前行的状态。

代码

::: code-tabs

@tab 动态规划

// 时间复杂度 O(m * n),空间复杂度 O(m * n)
/**
 * @param {number} m
 * @param {number} n
 * @return {number}
 */
var uniquePaths = function (m, n) {
	const dp = new Array(m).fill().map(() => new Array(n).fill(1));
	for (let i = 1; i < m; i++) {
		for (let j = 1; j < n; j++) {
			dp[i][j] = dp[i][j - 1] + dp[i - 1][j];
		}
	}
	return dp[m - 1][n - 1];
};

@tab 动态规划-状态压缩

// 时间复杂度 O(m * n),空间复杂度优化后为 O(n)
/**
 * @param {number} m
 * @param {number} n
 * @return {number}
 */
var uniquePaths = function (m, n) {
	const dp = new Array(n).fill(1);
	for (let i = 1; i < m; i++) {
		for (let j = 1; j < n; j++) {
			dp[j] = dp[j - 1] + dp[j];
		}
	}
	return dp[n - 1];
};

:::

相关题目

题号 标题 题解 标签 难度 力扣
63 不同路径 II [✓] 数组 动态规划 矩阵 🟠 🀄️ 🔗
64 最小路径和 [✓] 数组 动态规划 矩阵 🟠 🀄️ 🔗
174 地下城游戏 [✓] 数组 动态规划 矩阵 🔴 🀄️ 🔗
2087 网格图中机器人回家的最小代价 贪心 数组 🟠 🀄️ 🔗
2304 网格中的最小路径代价 数组 动态规划 矩阵 🟠 🀄️ 🔗
2400 恰好移动 k 步到达某一位置的方法数目 数学 动态规划 组合数学 🟠 🀄️ 🔗
2435 矩阵中和能被 K 整除的路径 数组 动态规划 矩阵 🔴 🀄️ 🔗