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

来源:互联网 发布:淘宝店铺提高销量 编辑:程序博客网 时间:2024/05/15 23:48

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

  • Unique Paths 63 Unique Paths II唯一路径12
    • Unique Paths
      • 题目链接
      • 题目描述
      • 题目分析
        • 方法动态规划
          • 算法描述
      • 参考代码
    • Unique Paths II
      • 题目链接
      • 题目描述
      • 题目分析
        • 方法动态规划
          • 算法描述
      • 参考代码

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];    }};
原创粉丝点击