栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java 求解不同的路径

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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];
    }
}
五、总结

可以直接用二维数组解题,如果需要优化的话,再优化

二维数组,理解的更加直观

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/643431.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号