Welcome to Subscribe On Youtube
Question
Formatted question description: https://leetcode.ca/all/64.html
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 1:
Input: grid = [[1,3,1],[1,5,1],[4,2,1]] Output: 7 Explanation: Because the path 1 → 3 → 1 → 1 → 1 minimizes the sum.
Example 2:
Input: grid = [[1,2,3],[4,5,6]] Output: 12
Constraints:
m == grid.length
n == grid[i].length
1 <= m, n <= 200
0 <= grid[i][j] <= 100
Algorithm
Code
-
public class Minimum_Path_Sum { public static void main (String[] args) { Minimum_Path_Sum out = new Minimum_Path_Sum(); Solution_recursion s = out.new Solution_recursion(); System.out.println(s.minPathSum(new int[][]{ {1,3,1}, {1,5,1}, {4,2,1} })); } public class Solution { public int minPathSum(int[][] grid) { if (grid.length == 0 || grid[0].length == 0) { return 0; } int m = grid.length; int n = grid[0].length; // dp[i][j] meaning min-sum at (i,j) int[][] dp = new int[m][n]; dp[0][0] = grid[0][0]; // pre-process, first row and col for (int j = 1; j < n; j++) { dp[0][j] = dp[0][j - 1] + grid[0][j]; } for (int i = 1; i < m; i++) { dp[i][0] = dp[i - 1][0] + grid[i][0]; } for (int i = 1; i < m; i++) { for (int j = 1; j < n; j++) { dp[i][j] = grid[i][j] + Math.min(dp[i - 1][j], dp[i][j - 1]); } } return dp[m - 1][n - 1]; } } class Solution_recursion { int min = Integer.MAX_VALUE; public int minPathSum(int[][] grid) { if (grid == null || grid.length == 0 || grid[0].length == 0) { return -1; } dfs (grid, 0, 0, 0); return min; } private void dfs(int[][] grid, int i, int j, int sum) { if (i < 0 || j < 0 || i >= grid.length || j >= grid[0].length) { // out of boundary return; } if (i == grid.length - 1 && j == grid[0].length - 1) { // reaching termination position min = Math.min(sum + grid[i][j], min); } dfs(grid, i + 1, j, sum + grid[i][j]); dfs(grid, i, j + 1, sum + grid[i][j]); // actually, if detour is allowed, then should probe for all 4 directions, since maybe there is a Ingeter.MIN value // dfs(grid, i + 1, j, sum + grid[i][j]); // dfs(grid, i + 1, j, sum + grid[i][j]); } } } ############ class Solution { 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 j = 1; j < n; ++j) { dp[0][j] = dp[0][j - 1] + grid[0][j]; } 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]; } }
-
// OJ: https://leetcode.com/problems/minimum-path-sum/ // Time: O(MN) // Space: O(1) class Solution { public: int minPathSum(vector<vector<int>>& A) { int M = A.size(), N = A[0].size(); for (int i = 0; i < M; ++i) { for (int j = 0; j < N; ++j) { int sum = min(i - 1 >= 0 ? A[i - 1][j] : INT_MAX, j - 1 >= 0 ? A[i][j - 1] : INT_MAX); A[i][j] += sum == INT_MAX ? 0 : sum; } } return A[M - 1][N - 1]; } };
-
class Solution: def minPathSum(self, grid: List[List[int]]) -> int: m, n = len(grid), len(grid[0]) dp = [[grid[0][0]] * n for _ in range(m)] for i in range(1, m): dp[i][0] = dp[i - 1][0] + grid[i][0] for j in range(1, n): dp[0][j] = dp[0][j - 1] + grid[0][j] 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[-1][-1] ############ class Solution(object): def minPathSum(self, grid): """ :type grid: List[List[int]] :rtype: int """ if len(grid) == 0: return 0 dp = [0 for _ in range(0, len(grid[0]))] dp[0] = grid[0][0] for j in range(1, len(grid[0])): dp[j] = dp[j - 1] + grid[0][j] for i in range(1, len(grid)): pre = dp[0] + grid[i][0] for j in range(1, len(grid[0])): dp[j] = min(dp[j], pre) + grid[i][j] pre = dp[j] dp[0] += grid[i][0] return dp[-1]
-
func minPathSum(grid [][]int) int { m, n := len(grid), len(grid[0]) dp := make([][]int, m) for i := 0; i < m; i++ { dp[i] = make([]int, n) } dp[0][0] = grid[0][0] for i := 1; i < m; i++ { dp[i][0] = dp[i-1][0] + grid[i][0] } for j := 1; j < n; j++ { dp[0][j] = dp[0][j-1] + grid[0][j] } for i := 1; i < m; i++ { for j := 1; j < n; j++ { dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j] } } return dp[m-1][n-1] } func min(a, b int) int { if a < b { return a } return b }
-
function minPathSum(grid: number[][]): number { let m = grid.length, n = grid[0].length; let dp = Array.from({ length: m }, v => new Array(n).fill(0)); dp[0][0] = grid[0][0]; for (let i = 1; i < m; ++i) { dp[i][0] = dp[i - 1][0] + grid[i][0]; } for (let j = 1; j < n; ++j) { dp[0][j] = dp[0][j - 1] + grid[0][j]; } for (let i = 1; i < m; ++i) { for (let 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]; }
-
/** * @param {number[][]} grid * @return {number} */ var minPathSum = function (grid) { let m = grid.length, n = grid[0].length; let dp = Array.from({ length: m }, v => new Array(n).fill(0)); dp[0][0] = grid[0][0]; for (let i = 1; i < m; ++i) { dp[i][0] = dp[i - 1][0] + grid[i][0]; } for (let j = 1; j < n; ++j) { dp[0][j] = dp[0][j - 1] + grid[0][j]; } for (let i = 1; i < m; ++i) { for (let 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]; };
-
public class Solution { 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 j = 1; j < n; ++j) { dp[0, j] = dp[0, j - 1] + grid[0][j]; } 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]; } }
-
impl Solution { pub fn min_path_sum(mut grid: Vec<Vec<i32>>) -> i32 { let m = grid.len(); let n = grid[0].len(); for i in 1..m { grid[i][0] += grid[i - 1][0]; } for i in 1..n { grid[0][i] += grid[0][i - 1]; } for i in 1..m { for j in 1..n { grid[i][j] += grid[i][j - 1].min(grid[i - 1][j]); } } grid[m - 1][n - 1] } }