前言
很久没有刷力扣了,昨天做了下每日一题。中等难度感觉有点名不副实了,一把过。今天记录一下思路吧,这道题作为dp算法入门倒是挺合适的。还不了解什么是动态规划的小伙伴可以先去百度一下。
题目描述
题目来自leetcode官网。
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
示例 1:
输入:m = 3, n = 7
输出:28
示例 2:
输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
- 向右 -> 向右 -> 向下
- 向右 -> 向下 -> 向右
- 向下 -> 向右 -> 向右
示例 4:
输入:m = 3, n = 3
输出:6
思路
看到这种所有解个数的问题,大家一般能想到的就是穷举,列出所有的可能性。当我看到这个题目时候第一时间就想到了动态规划,可能是刷题刷多了的好处吧。不过网上讲解动态规划很少有人会画图讲述思考过程,干脆我就画图来讲解这道题是怎么找到解题思路的。
首先可以先画个图,图中的数字代表路径个数。
假如网格只有一行两列或者一列两行,那么路径很明显只有一条:
下面画两行两列,那么有两条路径:
三行三列:
其他的就不用画了吧,其实思路很简单,不知大家看出规律来没,右下角的值等于它左边加上边方格里的值。什么意思呢,假设右下角的方块叫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网站自己试上一试。
原题路径:原题