leetcode 死磕動態規劃-入門1

每天堅持刷題!!!
因爲本人動態規劃實在是弱雞,激勵自己攻克難關

首先來一些leetcode上動態規劃的中等和簡單的題來練練手, 個人對動態規劃的理解就是可以把很多中間量儲存在一個狀態表裏。

leetcode 62 不同路徑

題目描述:
一個機器人位於一個 m x n 網格的左上角 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角,問總共有多少條不同的路徑?

題目分析:
1. 首先要吐槽下leetcode中m*n的矩陣竟然是n行m列,簡直反人類,但是這道題倒是無所謂結果都一樣。
2. 因爲機器人只能往下或是往右走,那麼任何一個格子只能從這個格子的上方和左方到達,即任何一個格子的全部走法數量爲上方格子(如果有)的走法數量加上左方格子(如果有)的走法數量之和。
3. 具體而言,先初始化一個m*n的二維矩陣(Python就是list of list),爲了方便起見,先計算第一行和第一列的數值,這個沒啥好說的,都是1,那麼就從(1,1)開始先行在列的遍歷整個矩陣,輸出矩陣的右下角元素即可

class Solution(object):
    def uniquePaths(self, m, n):
        """
        :type m: int
        :type n: int
        :rtype: int
        """
        if not m or not n:
            return 0
        if m == 1 or n == 1:
            return 1
        temp = [[0 for _ in xrange(n)] for _ in xrange(m)]
        for i in xrange(n):
            temp[0][i] = 1
        for i in xrange(m):
            temp[i][0] = 1
        for i in xrange(1, m):
            for j in xrange(1, n):
                temp[i][j] = temp[i-1][j] + temp[i][j-1]
        return temp[-1][-1]

leetcode 63 不同路徑 II
這道題跟上一道幾乎一樣就放一起做了

題目描述:
一個機器人位於一個 m x n 網格的左上角 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角現在考慮網格中有障礙物。那麼從左上角到右下角將會有多少條不同的路徑?

題目分析:
1. 這個跟上一道62幾乎一樣,唯一的不同是現在格子上有障礙物,那麼需要把有障礙物的位置的走法數量設置爲0即可,初始化第一列和第一行的時候也是一樣,最後吐槽下自己因爲是中午休息時寫的代碼質量爛。
2. 還有這個題目設置的喪心病狂一點是起始點也可能有障礙物….

class Solution(object):
    def uniquePathsWithObstacles(self, obstacleGrid):
        """
        :type obstacleGrid: List[List[int]]
        :rtype: int
        """
        if not obstacleGrid:
            return 0
        m = len(obstacleGrid)
        n = len(obstacleGrid[0])
        temp = [[0 for _ in xrange(n)] for _ in xrange(m)]
        temp[0][0] = 1 if obstacleGrid[0][0] == 0 else 0
        for i in xrange(1, n):
            temp[0][i] = 1 if temp[0][i-1] and obstacleGrid[0][i] == 0 else 0
        for i in xrange(1, m):
            temp[i][0] = 1 if temp[i-1][0] and obstacleGrid[i][0] == 0 else 0
        for i in xrange(1, m):
            for j in xrange(1, n):
                if obstacleGrid[i][j] == 1:
                    temp[i][j] = 0
                else:
                    temp[i][j] = temp[i-1][j] + temp[i][j-1]
        return temp[-1][-1]

leetcode 64 最小路徑和
PS:本來做完63想中午趴一會,一看64還是路徑就繼續做了…

題目描述:
給定一個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和爲最小。每次只能向下或者向右移動一步。

題目分析:
1. 我已經不想在看到路徑的題目了…
2. 這道題跟62沒啥區別,就是把加法變成min函數,即每一個格子的走法數量爲上方格子(如果有)的走法數量和左方格子(如果有)的走法數量的最小值

class Solution(object):
    def minPathSum(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        if not grid:
            return 0
        m = len(grid)
        n = len(grid[0])
        temp = [[0 for _ in xrange(n)] for _ in xrange(m)]
        temp[0][0] = grid[0][0]
        for i in xrange(1, n):
            temp[0][i] = temp[0][i-1] + grid[0][i]
        for i in xrange(1, m):
            temp[i][0] = temp[i-1][0] + grid[i][0]
        for i in xrange(1, m):
            for j in xrange(1, n):
                temp[i][j] = min(temp[i-1][j], temp[i][j-1]) + grid[i][j]
        return temp[-1][-1]

明天繼續死磕動態規劃

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章