62. Unique Paths & 63. Unique Paths II(唯一路径1&2)

本文探讨了LeetCode上的两道经典算法题目:唯一路径与唯一路径II。详细介绍了两种情况下机器人到达终点的不同路径计数方法,并提供了动态规划算法的实现思路及代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

62. Unique Paths & 63. Unique Paths II(唯一路径1&2)

62. Unique Paths

题目链接

https://leetcode.com/problems/unique-paths/description/

题目描述

A robot is located at the top-left corner of a m x n grid (marked ‘Start’ in the diagram below).

The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked ‘Finish’ in the diagram below).

How many possible unique paths are there?

Alt text

Above is a 3 x 7 grid. How many possible unique paths are there?

Note: m and n will be at most 100.

题目分析

由于题目规定只能向下或向右移动,那么对于任意方格grid[i][j]我们可以直接得到状态转移方程:
grid[i][j] = grid[i - 1][j] + grid[i][j - 1]
为了提高效率,我们可以使用递推的方法。通过进一步的考虑,事实上并不需要二维数组保存每个方格的路径数量,使用一维数组可以进一步降低空间复杂度。

方法:动态规划
算法描述

初始化长度为n的数组,每个元素值为1
循环m次,在每一次循环中:
从下标为1的元素开始遍历,对于每一个元素:
steps[j] += steps[j - 1]

参考代码

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

63. Unique Paths II

题目链接

https://leetcode.com/problems/unique-paths-ii/description/

题目描述

Follow up for “Unique Paths”:

Now consider if some obstacles are added to the grids. How many unique paths would there be?

An obstacle and empty space is marked as 1 and 0 respectively in the grid.

For example,

There is one obstacle in the middle of a 3x3 grid as illustrated below.

[
[0,0,0],
[0,1,0],
[0,0,0]
]

The total number of unique paths is 2.

Note: m and n will be at most 100.

题目分析

这道题目和上一道基本类似,唯一不同的是对障碍的处理,当地图上某点为障碍时,这一点的路径为0

方法:动态规划
算法描述

算法与上题相同,在遍历时考虑地图上此点是否为障碍,若为障碍,路径为0

参考代码

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        int m = obstacleGrid.size(), n = obstacleGrid[0].size();
        vector<int> steps(n, 0);
        steps[0] = 1;
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++) {
                if (obstacleGrid[i][j])
                    steps[j] = 0;
                else if (j)
                    steps[j] += steps[j - 1];
            }
        return steps[n - 1];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值