zoukankan      html  css  js  c++  java
  • leetcode刷题笔记六十二与六十三 不同路径与不同路径II

    leetcode刷题笔记六十二与六十三 不同路径与不同路径II


    第六十二题 不同路径

    源地址:62. 不同路径

    问题描述:

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

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

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

    示例 1:

    输入: m = 3, n = 2
    输出: 3
    解释:
    从左上角开始,总共有 3 条路径可以到达右下角。

    1. 向右 -> 向右 -> 向下
    2. 向右 -> 向下 -> 向右
    3. 向下 -> 向右 -> 向右
      示例 2:

    输入: m = 7, n = 3
    输出: 28

    提示:

    1 <= m, n <= 100
    题目数据保证答案小于等于 2 * 10 ^ 9

    代码补充:

    /**
    本题是较为简单的动态规划题目
    使用等大二维数组记录到达每个位置的方法计数
    初始状态:dp(0)(0) = 1
    初始化: 
    由于机器人只能沿下方向,右方向移动,故首行首列初始化均为1
    dp(i)(0) = 1 dp(0)(j) = 1
    动态方程(受左侧及上侧方法数影响):
    dp(i)(j) = dp(i-1)(j) + dp(i)(j-1)
    */
    object Solution {
        def uniquePaths(m: Int, n: Int): Int = {
            val dp = Array.ofDim[Int](m, n)
            for {
                i <- 0 until m
                j <- 0 until n
            } 
            dp(i)(j) = (i,j) match {
                case (0,0) => 1
                case (0,_) => 1
                case (_,0) => 1
                case (_,_) => dp(i-1)(j) + dp(i)(j-1)
            }
             return dp(m - 1)(n - 1)
        }
    }
    

    第六十三题 不同路径II

    源地址:63. 不同路径 II

    问题描述:

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

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

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

    说明:m 和 n 的值均不超过 100。

    示例 1:

    输入:
    [
    [0,0,0],
    [0,1,0],
    [0,0,0]
    ]
    输出: 2
    解释:
    3x3 网格的正中间有一个障碍物。
    从左上角到右下角一共有 2 条不同的路径:

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

    代码补充:

    /**
    与62题一致,使用动态规划方法
    不同的两点包括:
    1.对障碍点设置其对应位置方法数为0
    2.使用滚动数组思想,节省空间
    
    滚动数组是DP中一种编程方法,将数组滚动起来,每次使用固定的几个存储空间,达到压缩空间作用。以时间换空间的一种方法。
    就本题而言,使用length长度数组逐行扫描,更新数组位置基本上一次扫描的结果与其左侧计算结果。
    */
    import util.control.Breaks._
    object Solution {
        def uniquePathsWithObstacles(obstacleGrid: Array[Array[Int]]): Int = {
            val high = obstacleGrid.length
            val length = obstacleGrid(0).length
            val dp = Array.fill(length)(0)
            
            //防止第一个点即为障碍
            if(obstacleGrid(0)(0) == 1) dp(0) = 0
            else dp(0) = 1    
    
            for(i <- 0 to high-1){
                for(j <- 0 to length-1){
                    breakable{
                        if(obstacleGrid(i)(j) == 1){
                            dp(j) = 0
                            break
                        }
                        if(j>=1 && obstacleGrid(i)(j-1) == 0){
                            dp(j) += dp(j-1)
                        }
                    }
                }
            }
    
            return dp(length-1)
    
        }
    }
    
  • 相关阅读:
    JAVA核心技术笔记总结--第14章 线程总结
    java核心技术笔记——第 9 章 集合
    Java核心技术笔记——第 8 章 泛型
    2.面向对象三大特征
    1.浅谈面向对象思想
    8.字符串
    7.数组
    6.调试程序
    5.流程控制语句
    4.运算符
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/13300399.html
Copyright © 2011-2022 走看看