<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 1766字,需瀏覽 4分鐘

           ·

          2020-10-14 04:10

          算法的重要性,我就不多說了吧,想去大廠,就必須要經(jīng)過基礎(chǔ)知識(shí)和業(yè)務(wù)邏輯面試+算法面試。所以,為了提高大家的算法能力,這個(gè)公眾號(hào)后續(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.

          題意

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

          樣例

          輸入:
          [
          ??[1,3,1
          ],
          ??[1,5,1],
          ??[4,2,1]
          ]
          輸出: 7
          解釋: 因?yàn)槁窂?13111?的總和最小。


          解題


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

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

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

          有了遞推公式再來看一下邊界條件,當(dāng)在第一行的時(shí)候,因?yàn)椴荒軓纳厦孀呦聛恚援?dāng)前值就是前面的累加。同理第一列也一樣,因?yàn)樗荒軓淖筮呑哌^來,所以當(dāng)前值只能是上面的累加。

          比如上面圖中,如果我們走到中間這一步的話,我們可以從上面1→3→5走過來,也可以從左邊1→1→5,我們?nèi)∽钚〉募纯伞N覀儊砜聪麓a

          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++) {
          ????????????//遞推公式,取從上面走下來和從左邊走過來的最小值+當(dāng)前坐標(biāo)的值
          ????????????dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
          ????????}
          ????}
          ????return?dp[m - 1][n - 1];
          }
          好了,今天的文章就到這里,如果覺得有所收獲,請(qǐng)順手點(diǎn)個(gè)在看或者轉(zhuǎn)發(fā)吧,你們的支持是我最大的動(dòng)力。


          上期推文:

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

          瀏覽 59
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  多人操逼视频 | 99综合 | 6080伦理 | 99久久人妻无码精品系列 | 国产18第一无限资源网站 |