1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        ?LeetCode刷題實戰(zhàn)64:最小路徑和

        共 1766字,需瀏覽 4分鐘

         ·

        2020-10-14 04:10

        算法的重要性,我就不多說了吧,想去大廠,就必須要經(jīng)過基礎知識和業(yè)務邏輯面試+算法面試。所以,為了提高大家的算法能力,這個公眾號后續(xù)每天帶大家做一道算法題,題目就從LeetCode上面選 !

        今天和大家聊的問題叫做?最小路徑和,我們先來看題面:

        https://leetcode-cn.com/problems/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.

        題意

        給定一個包含非負整數(shù)的 m x n 網(wǎng)格,請找出一條從左上角到右下角的路徑,使得路徑上的數(shù)字總和為最小。
        說明:每次只能向下或者向右移動一步。

        樣例

        輸入:
        [
        ??[1,3,1
        ],
        ??[1,5,1],
        ??[4,2,1]
        ]
        輸出: 7
        解釋: 因為路徑 13111?的總和最小。


        解題


        本題解來源于力扣讀者(LeetCode)

        這題求的是從左上角到右下角,路徑上的數(shù)字和最小,并且每次只能向下或向右移動。所以上面很容易想到動態(tài)規(guī)劃求解。我們可以使用一個二維數(shù)組dp,dp[i][j]表示的是從左上角到坐標(i,j)的最小路徑和。那么走到坐標(i,j)的位置只有這兩種可能,要么從上面(i-1,j)走下來,要么從左邊(i,j-1)走過來,我們要選擇路徑和最小的再加上當前坐標的值就是到坐標(i,j)的最小路徑。

        所以遞推公式就是
        dp[i][j]=min(dp[i-1][j]+dp[i][j-1])+grid[i][j];

        有了遞推公式再來看一下邊界條件,當在第一行的時候,因為不能從上面走下來,所以當前值就是前面的累加。同理第一列也一樣,因為他不能從左邊走過來,所以當前值只能是上面的累加。

        比如上面圖中,如果我們走到中間這一步的話,我們可以從上面1→3→5走過來,也可以從左邊1→1→5,我們取最小的即可。我們來看下代碼

        public?int?minPathSum(int[][] grid)?{
        ????int?m = grid.length, n = grid[0].length;
        ????int[][] dp = new?int[m][n];
        ????dp[0][0] = grid[0][0];
        ????//第一列只能從上面走下來
        ????for?(int?i = 1; i < m; i++) {
        ????????dp[i][0] = dp[i - 1][0] + grid[i][0];
        ????}
        ????//第一行只能從左邊走過來
        ????for?(int?i = 1; i < n; i++) {
        ????????dp[0][i] = dp[0][i - 1] + grid[0][i];
        ????}
        ????for?(int?i = 1; i < m; i++) {
        ????????for?(int?j = 1; j < n; j++) {
        ????????????//遞推公式,取從上面走下來和從左邊走過來的最小值+當前坐標的值
        ????????????dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
        ????????}
        ????}
        ????return?dp[m - 1][n - 1];
        }
        好了,今天的文章就到這里,如果覺得有所收獲,請順手點個在看或者轉發(fā)吧,你們的支持是我最大的動力。


        上期推文:

        LeetCode40-60題匯總,速度收藏!
        LeetCode刷題實戰(zhàn)61:旋轉鏈表
        LeetCode刷題實戰(zhàn)62:不同路徑
        LeetCode刷題實戰(zhàn)63:不同路徑 II

        瀏覽 59
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            亚洲免费视频在线看 | 三上悠亚一区二区在线观看 | 久久久久国产精品嫩草影院 | 一边洗澡一边爱爱 | 女人自己扒开荫道口视频鼓包 | 久久久电影| 96亚洲精品久 | 孕妇裸体网站 | 久久久久久久精 | 天天日天天射试看二分钟 |