最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實(shí)現(xiàn)LeetCode(64.最小路徑和)

 更新時(shí)間:2021年07月16日 16:14:54   作者:Grandyang  
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(64.最小路徑和),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

[LeetCode] 64. Minimum Path Sum 最小路徑和

Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.

Note: You can only move either down or right at any point in time.

Example:

Input:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
Output: 7
Explanation: Because the path 1→3→1→1→1 minimizes the sum.

這道題給了我們一個(gè)只有非負(fù)數(shù)的二維數(shù)組,讓找一條從左上到右下的路徑,使得路徑和最小,限定了每次只能向下或者向右移動(dòng)。一個(gè)常見的錯(cuò)誤解法就是每次走右邊或下邊數(shù)字中較小的那個(gè),這樣的貪婪算法獲得的局部最優(yōu)解不一定是全局最優(yōu)解,因此是不行的。實(shí)際上這道題跟之前那道 Dungeon Game 沒有什么太大的區(qū)別,都需要用動(dòng)態(tài)規(guī)劃 Dynamic Programming 來做,這應(yīng)該算是 DP 問題中比較簡(jiǎn)單的一類,我們維護(hù)一個(gè)二維的 dp 數(shù)組,其中 dp[i][j] 表示到達(dá)當(dāng)前位置的最小路徑和。接下來找狀態(tài)轉(zhuǎn)移方程,因?yàn)榈竭_(dá)當(dāng)前位置 (i, j)  只有兩種情況,要么從上方 (i-1, j) 過來,要么從左邊 (i, j-1) 過來,我們選擇 dp 值較小的那個(gè)路徑,即比較 dp[i-1][j] 和 dp[i][j-1],將其中的較小值加上當(dāng)前的數(shù)字 grid[i][j],就是當(dāng)前位置的 dp 值了。但是有些特殊情況要提前賦值,比如起點(diǎn)位置,直接賦值為 grid[0][0],還有就是第一行和第一列,其中第一行的位置只能從左邊過來,第一列的位置從能從上面過來,所以這兩行要提前初始化好,然后再?gòu)?(1, 1) 的位置開始更新到右下角即可,反正難度不算大,代碼如下:

解法一:

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        if (grid.empty() || grid[0].empty()) return 0;
        int m = grid.size(), n = grid[0].size();
        vector<vector<int>> dp(m, vector<int>(n));
        dp[0][0] = grid[0][0];
        for (int i = 1; i < m; ++i) dp[i][0] = grid[i][0] + dp[i - 1][0];
        for (int j = 1; j < n; ++j) dp[0][j] = grid[0][j] + dp[0][j - 1];
        for (int i = 1; i < m; ++i) {
            for (int j = 1; j < n; ++j) {
                dp[i][j] = grid[i][j] + min(dp[i - 1][j], dp[i][j - 1]);
            }
        }
        return dp[m - 1][n - 1];
    }
};

我們可以優(yōu)化空間復(fù)雜度,可以使用一個(gè)一維的 dp 數(shù)組就可以了,初始化為整型最大值,但是 dp[0][0] 要初始化為0。之所以可以用一維數(shù)組代替之前的二維數(shù)組,是因?yàn)楫?dāng)前的 dp 值只跟左邊和上面的 dp 值有關(guān)。這里我們并不提前更新第一行或是第一列,而是在遍歷的時(shí)候判斷,若j等于0時(shí),說明是第一列,我們直接加上當(dāng)前的數(shù)字,否則就要比較是左邊的 dp[j-1] 小還是上面的 dp[j]  小,當(dāng)是第一行的時(shí)候,dp[j] 是整型最大值,所以肯定會(huì)取到 dp[j-1] 的值,然后再加上當(dāng)前位置的數(shù)字即可,參見代碼如下:

解法二:

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        if (grid.empty() || grid[0].empty()) return 0;
        int m = grid.size(), n = grid[0].size();
        vector<int> dp(n, INT_MAX);
        dp[0] = 0;
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (j == 0) dp[j] += grid[i][j];
                else dp[j] = grid[i][j] + min(dp[j], dp[j - 1]);
            }
        }
        return dp[n - 1];
    }
};

我們還可以進(jìn)一步的優(yōu)化空間,連一維數(shù)組都不用新建,而是直接使用原數(shù)組 grid 進(jìn)行累加,這里的累加方式跟解法一稍有不同,沒有提前對(duì)第一行和第一列進(jìn)行賦值,而是放在一起判斷了,當(dāng)i和j同時(shí)為0時(shí),直接跳過。否則當(dāng)i等于0時(shí),只加上左邊的值,當(dāng)j等于0時(shí),只加上面的值,否則就比較左邊和上面的值,加上較小的那個(gè)即可,參見代碼如下:

解法三:

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        if (grid.empty() || grid[0].empty()) return 0;
        for (int i = 0; i < grid.size(); ++i) {
            for (int j = 0; j < grid[i].size(); ++j) {
                if (i == 0 && j == 0) continue;
                if (i == 0) grid[0][j] += grid[0][j - 1];
                else if (j == 0) grid[i][0] += grid[i - 1][0];
                else grid[i][j] += min(grid[i - 1][j], grid[i][j - 1]);
            }
        }
        return grid.back().back();
    }
};

下面這種寫法跟上面的基本相同,只不過用了 up 和 left 兩個(gè)變量來計(jì)算上面和左邊的值,看起來稍稍簡(jiǎn)潔一點(diǎn),參見代碼如下:

解法四:

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        if (grid.empty() || grid[0].empty()) return 0;
        for (int i = 0; i < grid.size(); ++i) {
            for (int j = 0; j < grid[i].size(); ++j) {
                if (i == 0 && j == 0) continue;
                int up = (i == 0) ? INT_MAX : grid[i - 1][j];
                int left = (j == 0) ? INT_MAX : grid[i][j - 1];
                grid[i][j] += min(up, left);
            }
        }
        return grid.back().back();
    }
};

到此這篇關(guān)于C++實(shí)現(xiàn)LeetCode(64.最小路徑和)的文章就介紹到這了,更多相關(guān)C++實(shí)現(xiàn)最小路徑和內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言實(shí)現(xiàn)酒店預(yù)訂管理系統(tǒng)

    C語言實(shí)現(xiàn)酒店預(yù)訂管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)酒店預(yù)訂管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++內(nèi)存池兩種方案解析

    C++內(nèi)存池兩種方案解析

    這篇文章主要詳情介紹了C++內(nèi)存池兩種方案做對(duì)比,對(duì)此感興趣的小伙伴一起來看看吧
    2021-08-08
  • C++異常捕捉與處理的深入講解

    C++異常捕捉與處理的深入講解

    這篇文章主要給你大家介紹了關(guān)于C++異常捕捉與處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • 分享面試官常用16個(gè)c/c++面試題

    分享面試官常用16個(gè)c/c++面試題

    這篇文章主要分享的是面試官常用的16個(gè)c/c++面試題,?C中static有什么作用、C++中const有什么用?C與C++各自是如何定義常量的?有什么不同?等等問題,具有一定的參考資料,需要的小伙伴可以參考一下
    2022-01-01
  • Qt中QPixmap、QImage、QPicture、QBitmap四者區(qū)別詳解

    Qt中QPixmap、QImage、QPicture、QBitmap四者區(qū)別詳解

    Qt 提供了四個(gè)類來處理圖像數(shù)據(jù):QImage、QPixmap、QBitmap 和 QPicture,本文就詳細(xì)的介紹一下四者區(qū)別,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • VS中scanf函數(shù)報(bào)錯(cuò)問題的幾種解決方法

    VS中scanf函數(shù)報(bào)錯(cuò)問題的幾種解決方法

    本文主要介紹了VS中scanf函數(shù)報(bào)錯(cuò)問題的幾種解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • C和C++的函數(shù)調(diào)用約定你知道多少

    C和C++的函數(shù)調(diào)用約定你知道多少

    這篇文章主要為大家詳細(xì)介紹了C和C++的函數(shù)調(diào)用約定,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C++使用map實(shí)現(xiàn)多進(jìn)程拷貝文件的程序思路

    C++使用map實(shí)現(xiàn)多進(jìn)程拷貝文件的程序思路

    這篇文章主要介紹了C++使用mmap實(shí)現(xiàn)多進(jìn)程拷貝文件,通過本文給大家分享程序思路及完整代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • C++實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能

    C++實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • C語言數(shù)據(jù)結(jié)構(gòu)之二叉樹詳解

    C語言數(shù)據(jù)結(jié)構(gòu)之二叉樹詳解

    二叉樹(Binary tree)是樹形結(jié)構(gòu)的一個(gè)重要類型。許多實(shí)際問題抽象出來的數(shù)據(jù)結(jié)構(gòu)往往是二叉樹形式。本文將通過示例詳細(xì)講解一下二叉樹,需要的可以參考一下
    2022-03-03

最新評(píng)論

连平县| 南丰县| 全南县| 增城市| 介休市| 乐亭县| 伊宁市| 镇平县| 五家渠市| 新疆| 元阳县| 眉山市| 边坝县| 西乌珠穆沁旗| 当雄县| 克什克腾旗| 昔阳县| 扬州市| 白玉县| 临潭县| 襄汾县| 鹤岗市| 开封市| 海晏县| 克拉玛依市| 平凉市| 博乐市| 红原县| 成都市| 长沙市| 甘泉县| 曲松县| 重庆市| 读书| 新巴尔虎左旗| 资溪县| 乌审旗| 廊坊市| 出国| 个旧市| 宜良县|