[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.
给定一个m x n 的含有非负整数的方格,从左上角移动到右下角,每次只能向下或者向右移动,找出最小的路径和。
解法:动态归化(Dynamic Programming),
State: dp[i][j],表示从(0, 0)到(i, j)最小的路径和
Function: dp[i][j] = min(dp[i][j-1], dp[i-1][j]) + grid[i][j]
Initialize: dp[0][0] = grid[0][0]
Return: dp[m - 1][n - 1]
Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | public class Solution { public int minPathSum( int [][] grid) { if (grid == null || grid.length == 0 || grid[ 0 ].length == 0 ) { return 0 ; } int M = grid.length; int 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 ]; } } |
Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class Solution: # @param grid, a list of lists of integers # @return an integer def minPathSum( self , grid): m = len (grid); n = len (grid[ 0 ]) dp = [[ 0 for i in range (n)] for j in range (m)] dp[ 0 ][ 0 ] = grid[ 0 ][ 0 ] for i in range ( 1 , n): dp[ 0 ][i] = dp[ 0 ][i - 1 ] + grid[ 0 ][i] for i in range ( 1 , m): dp[i][ 0 ] = dp[i - 1 ][ 0 ] + grid[i][ 0 ] for i in range ( 1 , m): for j in range ( 1 , n): dp[i][j] = min (dp[i - 1 ][j], dp[i][j - 1 ]) + grid[i][j] return dp[m - 1 ][n - 1 ] |
Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class Solution: # @param grid, a list of lists of integers # @return an integer def minPathSum( self , grid): sum = list (grid[ 0 ]) for j in xrange ( 1 , len (grid[ 0 ])): sum [j] = sum [j - 1 ] + grid[ 0 ][j] for i in xrange ( 1 , len (grid)): sum [ 0 ] + = grid[i][ 0 ] for j in xrange ( 1 , len (grid[ 0 ])): sum [j] = min ( sum [j - 1 ], sum [j]) + grid[i][j] return sum [ - 1 ] |
Python: wo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | class Solution( object ): def minPathSum( self , grid): """ :type grid: List[List[int]] :rtype: int """ m, n = len (grid), len (grid[ 0 ]) dp = [[ 0 ] * n for i in xrange (m)] for i in xrange (m): for j in xrange (n): if i = = 0 and j = = 0 : dp[i][j] = grid[i][j] elif i = = 0 : dp[i][j] = grid[i][j] + dp[i][j - 1 ] elif j = = 0 : dp[i][j] = grid[i][j] + dp[i - 1 ][j] else : dp[i][j] = min (dp[i - 1 ][j], dp[i][j - 1 ]) + grid[i][j] return dp[ - 1 ][ - 1 ] |
Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class Solution: """ @param grid: a list of lists of integers. @return: An integer, minimizes the sum of all numbers along its path """ def minPathSum( self , grid): for i in range ( len (grid)): for j in range ( len (grid[ 0 ])): if i = = 0 and j > 0 : grid[i][j] + = grid[i][j - 1 ] elif j = = 0 and i > 0 : grid[i][j] + = grid[i - 1 ][j] elif i > 0 and j > 0 : grid[i][j] + = min (grid[i - 1 ][j], grid[i][j - 1 ]) return grid[ len (grid) - 1 ][ len (grid[ 0 ]) - 1 ] |
C++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | class Solution { public : /** * @param grid: a list of lists of integers. * @return: An integer, minimizes the sum of all numbers along its path */ int minPathSum(vector<vector< int > > &grid) { // write your code here int f[1000][1000]; if (grid.size() == 0 || grid[0].size() == 0) return 0; f[0][0] = grid[0][0]; for ( int i = 1; i < grid.size(); i++) f[i][0] = f[i-1][0] + grid[i][0]; for ( int i = 1; i < grid[0].size(); i++) f[0][i] = f[0][i-1] + grid[0][i]; for ( int i = 1; i < grid.size(); i++) for ( int j = 1; j < grid[0].size(); j++) f[i][j] = min(f[i-1][j], f[i][j-1]) + grid[i][j]; return f[grid.size()-1][grid[0].size()-1]; } }; |
类似题目:
[LeetCode] 174. Dungeon Game 地牢游戏
All LeetCode Questions List 题目汇总
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步