Java 求解不同的路径
Posted 南淮北安
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 求解不同的路径相关的知识,希望对你有一定的参考价值。
一、题目
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
二、动态规划题目分析
题目说明每次只能向下走,或者向右走,所以当前路径其实依赖于上一步路径的走法
所以可以进行动态规划分析
(1)确定 dp 数组及数组下标含义
dp[i][j]
:表示从(0,0)
出发到(i,j)
有dp[i][j]
条不同的路径
(2)确定递推关系式
每次只能往下走,或者向右走,所以当前路径等于从上往下走,或者从左往右走之和
dp[i][j]=dp[i-1][j]+dp[i][j-1]
(3)初始化
dp[0][j]
和dp[i][0]
都只有一条路径
(4)确定遍历顺序
由递推关系式可知,是从前向后,从左到右的遍历顺序
三、代码
class Solution
public int uniquePaths(int m, int n)
int[][] dp = new int[m][n];
int count = 0;
//初始化 dp 数组
for (int i = 0; i < m; i++)
dp[i][0] = 1;
for (int i = 0; i < n; i++)
dp[0][i] = 1;
//遍历,dp 数组赋值
for (int i = 1; i < m; i++)
for (int j = 1; j < n; j++)
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
return dp[m - 1][n - 1];
四、代码优化
本题递推关系式的关键:dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
发现,对于 dp[i][j]
来说,其实只需要获取上一行的值就可以了,
所以可以简化为一维数组dp[j],当取到dp[j]时,未赋值之前,里面存储的是上一行的dp[j],而且左边的dp[j-1]已经得到,所以可以设定:
class Solution
public int uniquePaths(int m, int n)
int[] dp = new int[n];
int count = 0;
//初始化首行值
for (int i = 0; i < n; i++)
dp[i] = 1;
//
for (int i = 1; i < m; i++)
for (int j = 1; j < n; j++)
//当前行的值=上一行的值+左方的值
dp[j] = dp[j] + dp[j - 1];
return dp[n - 1];
五、总结
可以直接用二维数组解题,如果需要优化的话,再优化
二维数组,理解的更加直观
以上是关于Java 求解不同的路径的主要内容,如果未能解决你的问题,请参考以下文章
SecurityError:replaceState 无法将历史记录更新为在路径、查询或片段以外的组件中不同的 URL