天天看点

动态规划---LeetCode 不同路径

前言

很久没有刷力扣了,昨天做了下每日一题。中等难度感觉有点名不副实了,一把过。今天记录一下思路吧,这道题作为dp算法入门倒是挺合适的。还不了解什么是动态规划的小伙伴可以先去百度一下。

题目描述

题目来自leetcode官网。

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

问总共有多少条不同的路径?

动态规划---LeetCode 不同路径

示例 1:

输入:m = 3, n = 7

输出:28

示例 2:

输入:m = 3, n = 2

输出:3

解释:

从左上角开始,总共有 3 条路径可以到达右下角。

  1. 向右 -> 向右 -> 向下
  2. 向右 -> 向下 -> 向右
  3. 向下 -> 向右 -> 向右

示例 4:

输入:m = 3, n = 3

输出:6

思路

看到这种所有解个数的问题,大家一般能想到的就是穷举,列出所有的可能性。当我看到这个题目时候第一时间就想到了动态规划,可能是刷题刷多了的好处吧。不过网上讲解动态规划很少有人会画图讲述思考过程,干脆我就画图来讲解这道题是怎么找到解题思路的。

首先可以先画个图,图中的数字代表路径个数。

假如网格只有一行两列或者一列两行,那么路径很明显只有一条:

动态规划---LeetCode 不同路径
动态规划---LeetCode 不同路径

下面画两行两列,那么有两条路径:

动态规划---LeetCode 不同路径

三行三列:

动态规划---LeetCode 不同路径

其他的就不用画了吧,其实思路很简单,不知大家看出规律来没,右下角的值等于它左边加上边方格里的值。什么意思呢,假设右下角的方块叫X,到达X的路径就等于 起始位置到X左边方块的路径 加上 起始位置到X上边路径的个数。

这个关系就是动态规划中很重要的递推关系,当前位置的结果需要用到前面步骤的结果,才能使用dp算法。

而边界条件也是很明显的,第一行和第一列都是只有一条路径可以到达。下面就来写代码。

代码

class Solution {
    public int uniquePaths(int m, int n) {
    	//使用二维数组记录结果
        int[][] temp = new int[m][n];
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if( i== 0){
                    //第一行  结果都是1
                    temp[i][j] = 1;
                    continue;
                }
                if(j == 0){
                    // 第一列  结果都是1
                    temp[i][j] = 1;
                    continue;
                }
                //ij的值 = 左边 + 上边
                temp[i][j] = temp[i][j-1]+temp[i-1][j];
            }
        }
        return temp[m-1][n-1];
    }
}
           

代码还是很简单的。看下执行结果吧:

执行结果:通过
显示详情
执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:35.4 MB, 在所有 Java 提交中击败了58.36%的用户
           

小伙伴们可以去LeetCode网站自己试上一试。

原题路径:原题