国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

leetcode63. 不同路徑 II(動態(tài)規(guī)劃-java)

這篇具有很好參考價值的文章主要介紹了leetcode63. 不同路徑 II(動態(tài)規(guī)劃-java)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

leetcode63. 不同路徑 II

來源:力扣(LeetCode)
鏈接:https://leetcode.cn/problems/unique-paths-ii

題目描述

一個機(jī)器人位于一個 m x n 網(wǎng)格的左上角 (起始點在下圖中標(biāo)記為 “Start” )。
機(jī)器人每次只能向下或者向右移動一步。機(jī)器人試圖達(dá)到網(wǎng)格的右下角(在下圖中標(biāo)記為 “Finish”)。
現(xiàn)在考慮網(wǎng)格中有障礙物。那么從左上角到右下角將會有多少條不同的路徑?
網(wǎng)格中的障礙物和空位置分別用 1 和 0 來表示。

示例1:
leetcode63. 不同路徑 II(動態(tài)規(guī)劃-java)
輸入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
輸出:2
解釋:3x3 網(wǎng)格的正中間有一個障礙物。
從左上角到右下角一共有 2 條不同的路徑:

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

示例2:
leetcode63. 不同路徑 II(動態(tài)規(guī)劃-java)
輸入:obstacleGrid = [[0,1],[0,0]]
輸出:1

提示:
m == obstacleGrid.length
n == obstacleGrid[i].length
1 <= m, n <= 100
obstacleGrid[i][j] 為 0 或 1

暴力遞歸

這題是leetcode62. 不同路徑 的拓展版.加了障礙物,解題思路是一樣的,只是要加下障礙物的判斷.
還是向下和向右兩個方向的選擇,兩種情況的和就是所有的路線數(shù).

代碼演示

/**
* 主方法
*/
 public int uniquePathsWithObstacles(int[][] obstacleGrid) {
 	//如果右下角是障礙物,怎么都過不去,直接返回0
        if(obstacleGrid[obstacleGrid.length - 1][obstacleGrid[0].length - 1] == 1){
            return 0;
        }
        //開始遞歸
        return process(obstacleGrid,0,0);
    }
	/**
	* 暴力遞歸
	* i 和 j 描述當(dāng)前在的位置
	*/
    public int process(int[][]obstacleGrid,int i,int j){
    	//base case 來到最后一個位置,前面路線有效,返回1
        if(i == obstacleGrid.length - 1 && j == obstacleGrid[0].length - 1 ){
            return 1;
        }
        //越界,路線無效 返回0
        if(i >= obstacleGrid.length || j >= obstacleGrid[0].length){
            return 0;
        }
        // 碰到障礙物,無效返回0
        if(obstacleGrid[i][j] == 1){
            return 0;
        }
        //x向下和向右兩種情況
        int down = process(obstacleGrid,i + 1,j);
        int right = process(obstacleGrid,i,j + 1);
        //兩種情況累加就是所有的路線
        return down + right;
    }

動態(tài)規(guī)劃

從暴力遞歸中可以得知,(i,j) 位置依賴 (i+1,j)和(i,j+1)兩個位置,所以可以輕松得到狀態(tài)轉(zhuǎn)移方程是:

f(i,j) = f(i+1,j) + f(i,j+1;
但這里有一些需要注意的地方,就是障礙物的處理,和dp表的初始化,我們以圖為例:
leetcode63. 不同路徑 II(動態(tài)規(guī)劃-java)
上面圖代表要走的網(wǎng)格,我只填寫了最后一行和一列其他位置沒有標(biāo)注,因為現(xiàn)在只討論最后一行和一列的情況.
最后一行為例,三角符號標(biāo)注的位置是最后一次出現(xiàn)的障礙物,在這個障礙物之前的最后一行位置,都無法到最后位置了,所以之前的位置在dp 表中要初始化為0,之后的可以初始化為1,
最后一列也是同樣情況:
下面看下代碼中如何處理;

代碼演示

  /**
     * 動態(tài)規(guī)劃
     * @param obstacleGrid
     * @return
     */
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int n = obstacleGrid.length;
        int m = obstacleGrid[0].length;
        //最有下角如果是障礙物,就無法過去,返回 0
        if (obstacleGrid[n - 1][m - 1] == 1) {
            return 0;
        }
        //動態(tài)規(guī)劃表
        int[][]dp = new int[n][m];
        //來標(biāo)記最后一行最后一次出現(xiàn)障礙物的位置
        int flagN = -1;
        //來標(biāo)記最后一列最后一次出現(xiàn)障礙物的位置
        int flagM = -1;
        for (int i = m - 1; i >= 0;i--){
            if(obstacleGrid[n - 1][i] == 1){
                flagN = i;
                break;
            }
        }
        //最后一個障礙物之后的位置初始化為1
        for (int i = flagN + 1; i < m;i++){
            dp[n - 1][i] = 1;
        }
        //標(biāo)記最后一列最后一次出現(xiàn)障礙物的位置.
        for (int j =  n - 1; j >= 0;j--){
            if(obstacleGrid[j][m - 1] == 1){
                flagM = j;
                break;
            }
        }
        //最后一個障礙物之后的位置初始化為1
        for (int j = flagM + 1; j < n;j++){
            dp[j][m - 1] = 1;
        }

        for (int i = n - 2;i >= 0;i--){
            for (int j = m - 2;j >= 0;j--){
                //當(dāng)前位置本身是障礙物 即為0
                if(obstacleGrid[i][j] == 1){
                    dp[i][j] = 0;
                }else{
                    //z狀態(tài)轉(zhuǎn)移方程
                    dp[i][j] = dp[i + 1][j] + dp[i][j + 1];
                }

            }
        }
        return dp[0][0];
    }

動態(tài)規(guī)劃空間壓縮

  /**
     * 動態(tài)規(guī)劃 + 空間壓縮
     * @param obstacleGrid
     * @return
     */
    public int uniquePathsWithObstacles2(int[][] obstacleGrid) {
        int n = obstacleGrid.length;
        int m = obstacleGrid[0].length;
        if (obstacleGrid[n - 1][m - 1] == 1) {
            return 0;
        }
        int[]dp = new int[m];
        int flagN = -1;
        for (int i = m - 1; i >= 0;i--){
            if(obstacleGrid[n - 1][i] == 1){
                flagN = i;
                break;
            }
        }
        for (int i = flagN + 1; i < m;i++){
            dp[i] = 1;
        }
        int flagM = -1;
        for (int j =  n - 1; j >= 0;j--){
            if(obstacleGrid[j][m - 1] == 1){
                flagM = j;
                break;
            }
        }

        for (int i = n - 2;i >= 0;i--){
            dp[m - 1] = i > flagM ? 1 : 0;
            for (int j = m - 2;j >= 0;j--){
                if(obstacleGrid[i][j] == 1){
                    dp[j] = 0;
                }else{
                    dp[j] = dp[j] + dp[j + 1];
                }

            }
        }
        return dp[0];
    }

動態(tài)規(guī)劃專題

leetcode62. 不同路徑

leetcode877. 石子游戲

leetcode64. 最小路徑和

leetcode416. 分割等和子集

leetcode354. 俄羅斯套娃信封問題

leetcode300. 最長遞增子序列

leetcode337. 打家劫舍 III文章來源地址http://www.zghlxwxcb.cn/news/detail-503367.html

到了這里,關(guān)于leetcode63. 不同路徑 II(動態(tài)規(guī)劃-java)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 隨想錄Day39--動態(tài)規(guī)劃: 62.不同路徑 , 63. 不同路徑 II

    隨想錄Day39--動態(tài)規(guī)劃: 62.不同路徑 , 63. 不同路徑 II

    今天的路勁問題,思想和昨天的爬樓梯一樣,主要還是找到你這個位置是怎么來的,到達(dá)dp[i][j]的方法由到達(dá)dp[i - 1][j]的方法再加上到達(dá)dp[i][j - 1]的方法和。在初始化時,當(dāng)i=0或者j=0時,到達(dá)他們的只有一條路勁,就是直走,所以對它進(jìn)行初始化。 63. 不同路徑 II 加了一個障

    2024年02月03日
    瀏覽(31)
  • 我在代碼隨想錄|寫代碼Day33 | 動態(tài)規(guī)劃| 路徑問題| 62.不同路徑,63. 不同路徑 II,343. 整數(shù)拆分

    我在代碼隨想錄|寫代碼Day33 | 動態(tài)規(guī)劃| 路徑問題| 62.不同路徑,63. 不同路徑 II,343. 整數(shù)拆分

    ??博客介紹`: 27dCnc ??系列專欄: 數(shù)據(jù)結(jié)構(gòu)與算法 算法入門 C++項目 ?? 當(dāng)前專欄: 算法入門 專題 : 數(shù)據(jù)結(jié)構(gòu)幫助小白快速入門算法 ???????????????????????? ☆*: .?. o(≧▽≦)o .?.:*☆ ??感謝大家點贊??收藏?評論?? 今日學(xué)習(xí)打卡 代碼隨想錄 - 動態(tài)規(guī)劃

    2024年03月11日
    瀏覽(96)
  • 【算法|動態(tài)規(guī)劃No.6】leetcode63. 不同路徑Ⅱ

    【算法|動態(tài)規(guī)劃No.6】leetcode63. 不同路徑Ⅱ

    個人主頁:平行線也會相交 歡迎 點贊?? 收藏? 留言? 加關(guān)注??本文由 平行線也會相交 原創(chuàng) 收錄于專欄【手撕算法系列專欄】【LeetCode】 ??本專欄旨在提高自己算法能力的同時,記錄一下自己的學(xué)習(xí)過程,希望對大家有所幫助 ??希望我們一起努力、成長,共同進(jìn)步。

    2024年02月16日
    瀏覽(20)
  • LeetCode刷題筆記【30】:動態(tài)規(guī)劃專題-2(不同路徑、不同路徑 II)

    LeetCode刷題筆記【30】:動態(tài)規(guī)劃專題-2(不同路徑、不同路徑 II)

    參考前文 參考文章: LeetCode刷題筆記【29】:動態(tài)規(guī)劃專題-1(斐波那契數(shù)、爬樓梯、使用最小花費爬樓梯) LeetCode鏈接:https://leetcode.cn/problems/unique-paths/description/ 動態(tài)規(guī)劃 : 創(chuàng)建m×n的數(shù)組, 對應(yīng)這個地圖, 數(shù)組 val 表示 有幾種方法可以走到這一格 最開始, 第一行和第一列v

    2024年02月09日
    瀏覽(48)
  • 算法leetcode|63. 不同路徑 II(rust重拳出擊)

    算法leetcode|63. 不同路徑 II(rust重拳出擊)

    一個機(jī)器人位于一個 m x n 網(wǎng)格的左上角 (起始點在下圖中標(biāo)記為 “Start” )。 機(jī)器人每次只能向下或者向右移動一步。機(jī)器人試圖達(dá)到網(wǎng)格的右下角(在下圖中標(biāo)記為 “Finish”)。 現(xiàn)在考慮網(wǎng)格中有障礙物。那么從左上角到右下角將會有多少條不同的路徑? 網(wǎng)格中的障礙

    2024年02月16日
    瀏覽(27)
  • 【算法與數(shù)據(jù)結(jié)構(gòu)】63、LeetCode不同路徑 II

    【算法與數(shù)據(jù)結(jié)構(gòu)】63、LeetCode不同路徑 II

    所有的LeetCode題解索引,可以看這篇文章——【算法和數(shù)據(jù)結(jié)構(gòu)】LeetCode題解。 ?? 思路分析 :參考【算法與數(shù)據(jù)結(jié)構(gòu)】62、LeetCode不同路徑的題目,可以發(fā)現(xiàn)本題僅僅是多了障礙物。我們還是用動態(tài)規(guī)劃來做。有障礙物的地方無法到達(dá),因此路徑數(shù)量為0,只需要將障礙物位

    2024年02月02日
    瀏覽(20)
  • 代碼隨想錄Day33 LeetCode T62不同路徑 LeetCode T63 不同路徑II

    代碼隨想錄Day33 LeetCode T62不同路徑 LeetCode T63 不同路徑II

    動規(guī)五部曲 1.確定dp數(shù)組含義 2.確定遞推公式 3.初始化數(shù)組 4.確定遍歷方式 5.打印dp數(shù)組查看分析問題 題目鏈接:62. 不同路徑 - 力扣(LeetCode) 注:n行m列而不是m行n列 1.確定dp數(shù)組含義 代表到達(dá)此下標(biāo)有多少條路徑 2.確定遞推公式 因為只能向右或者向下走,所以到達(dá)i,j這個點的

    2024年02月06日
    瀏覽(25)
  • 動態(tài)規(guī)劃——不同路徑II

    63. 不同路徑 II - 力扣(LeetCode)?編輯https://leetcode.cn/problems/unique-paths-ii/description/ https://leetcode.cn/problems/unique-paths-ii/description/ 問題描述:一個機(jī)器人位于一個?m x n?網(wǎng)格的左上角 (起始點在下圖中標(biāo)記為 “Start” )。 機(jī)器人每次只能向下或者向右移動一步。機(jī)器人試圖達(dá)

    2024年01月16日
    瀏覽(24)
  • 【學(xué)會動態(tài)規(guī)劃】不同路徑 II(6)

    【學(xué)會動態(tài)規(guī)劃】不同路徑 II(6)

    目錄 動態(tài)規(guī)劃怎么學(xué)? 1. 題目解析 2. 算法原理 1. 狀態(tài)表示 2. 狀態(tài)轉(zhuǎn)移方程 3. 初始化 4. 填表順序 5. 返回值 3. 代碼編寫 寫在最后: 學(xué)習(xí)一個算法沒有捷徑,更何況是學(xué)習(xí)動態(tài)規(guī)劃, 跟我一起刷動態(tài)規(guī)劃算法題,一起學(xué)會動態(tài)規(guī)劃! 題目鏈接:63. 不同路徑 II - 力扣(Leet

    2024年02月15日
    瀏覽(17)
  • DAY39 62.不同路徑 + 63. 不同路徑 II

    題目要求:一個機(jī)器人位于一個 m x n 網(wǎng)格的左上角 (起始點在下圖中標(biāo)記為 “Start” )。 機(jī)器人每次只能向下或者向右移動一步。機(jī)器人試圖達(dá)到網(wǎng)格的右下角(在下圖中標(biāo)記為 “Finish” )。 問總共有多少條不同的路徑? 根據(jù)“機(jī)器人每次只能向下或者向右移動一步”

    2024年02月07日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包