java LeetCode题解不同路径

 更新时间:2023年06月15日 15:16:02   作者:搬码人  
这篇文章主要为大家介绍了java LeetCode题解不同路径示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

题目描述

一个机器人位于一个m×n网格的左上角。

机器人每次只能向下或者向右移动一步。机器人试图到达网格的右下角 。

现在考虑网格中有障碍物。那么从左上角到右下角 将会有多少条不同的路径呢?

网格中的障碍物和空位置分别用1和0表示。

示例

来自LeetCode

输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]

输出:2

解释:3x3 网格的正中间有一个障碍物。

从左上角到右下角一共有 2 条不同的路径:

  • 向右 -> 向右 -> 向下 -> 向下
  • 向下 -> 向下 -> 向右 -> 向右

方法思路

同前面的不同路径解法一样,最优方法是采用动态规划。

此处同时采用滚动数组优化空间。

我们用f(i,j)来表示从坐标(0,0)到坐标(i,j)的路径数,u(i,j)表示坐标(i,j)是否可行,如果坐标(i,j)有障碍物,u(i,j)=0,否则u(i,j)=1。

因为机器人只能向下或者向右移动,所以坐标(0,0)到坐标(i,j)的路径总数的值只能取决于坐标(0,0)到坐标(i-1,j)的路径总数和从坐标(0,0)到坐标(i,j-1)的路径总数,即f(i,j)只能通过f(i-1,j)和坐标f(i,j-1)转移得到。当坐标(i,j)本身有障碍物的时候,

任何路径都到不了f(i,j),此时f(i,j)=0。

class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int n = obstacleGrid.length;
        int m = obstacleGrid[0].length;
        int[] f = new int[m];
        f[0]= obstacleGrid[0][0]==0?1:0;
        for(int i=0;i<n;++i){
            for(int j=0;j<m;++j){
                if(obstacleGrid[i][j]==1){
                    f[j]=0;
                    continue;
                }
                if(j>=1&&obstacleGrid[i][j-1]==0){
                    f[j]+=f[j-1];
                }
            }
        }
        return f[m-1];
    }
}

复杂度分析

  • 时间复杂度:O(nm),其中n为网格的行数,m为网格的列数。
  • 空间复杂度:O(m)。利用滚动数组优化,我们可以只用O(m)大小的空间来记录当前行的通路值。

以上就是java LeetCode题解不同路径的详细内容,更多关于java LeetCode不同路径的资料请关注脚本之家其它相关文章!

相关文章

  • Spring MVC获取参数和自定义参数类型转换器及编码过滤器

    Spring MVC获取参数和自定义参数类型转换器及编码过滤器

    这篇文章主要为大家详细介绍了Spring MVC获取参数和自定义参数类型转换器及编码过滤器,文中通过代码示例介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2023-06-06
  • 浅谈servlet与jsp的关系

    浅谈servlet与jsp的关系

    本文主要介绍了servlet与jsp的相关知识,并总结出servlet与jsp之间的关系,具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • java向多线程中传递参数的三种方法详细介绍

    java向多线程中传递参数的三种方法详细介绍

    但在多线程的异步开发模式下,数据的传递和返回和同步开发模式有很大的区别。由于线程的运行和结束是不可预料的,因此,在传递和返回数据时就无法象函数一样通过函数参数和return语句来返回数据
    2012-11-11
  • java对象转成byte数组的3种方法

    java对象转成byte数组的3种方法

    这篇文章主要为大家详细介绍了java对象转成byte数组的3种方法,具有一定的参考价值,感兴趣的朋友可以参考一下
    2018-06-06
  • Java实现图片裁剪功能的示例详解

    Java实现图片裁剪功能的示例详解

    这篇文章主要介绍了如何利用Java实现图片裁剪功能,可以将图片按照自定义尺寸进行裁剪,文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-01-01
  • 浅析Spring Security登录验证流程源码

    浅析Spring Security登录验证流程源码

    这篇文章主要介绍了Spring Security登录验证流程源码解析,本文结合源码讲解登录验证流程,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-11-11
  • Springboot基于BCrypt非对称加密字符串的实现

    Springboot基于BCrypt非对称加密字符串的实现

    本文主要介绍了Springboot基于BCrypt非对称加密字符串的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • MAC下如何设置JDK环境变量

    MAC下如何设置JDK环境变量

    这篇文章主要介绍了MAC下如何设置JDK环境变量问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • 解析Java的Jackson库中Streaming API的使用

    解析Java的Jackson库中Streaming API的使用

    这篇文章主要介绍了解析Java的Jackson库中Streaming API的使用,Jackson被用于Java对象和JSON的互相转换,需要的朋友可以参考下
    2016-01-01
  • Intellij IDEA安装lombok插件及使用详解

    Intellij IDEA安装lombok插件及使用详解

    今天小编就为大家分享一篇关于Intellij IDEA安装lombok插件及使用详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12

最新评论