zoukankan      html  css  js  c++  java
  • [LeetCode] 64. 最小路径和

    题目链接 : https://leetcode-cn.com/problems/minimum-path-sum/

    题目描述:

    给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

    说明:每次只能向下或者向右移动一步。

    示例:

    输入:
    [
      [1,3,1],
      [1,5,1],
      [4,2,1]
    ]
    输出: 7
    解释: 因为路径 1→3→1→1→1 的总和最小。
    

    思路:

    62. 不同路径,63. 不同路径 II是一类的题型.

    动态规划,用dp[i][j]表示到i,j的最小路径和.

    动态方程: dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]

    注意这里的第一行,和第一列要单独考虑,

    还有可以直接在grid上操作,优化空间!

    再附上自顶向下动态规划, 大家可以附上 Java 代码吗?

    代码:

    自底向上

    class Solution:
        def minPathSum(self, grid: List[List[int]]) -> int:
            if not grid: return 0
            row = len(grid)
            col = len(grid[0])
            dp = [[0]*col for _ in range(row)]
            dp[0][0] = grid[0][0]
            # 第一行
            for j in range(1, col):
                dp[0][j] = dp[0][j-1] + grid[0][j]
            # 第一列
            for i in range(1, row):
                dp[i][0] = dp[i-1][0] + grid[i][0]
            
            for i in range(1, row):
                for j in range(1, col):
                    dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]
            return dp[-1][-1]
    

    java

    class Solution {
        public int minPathSum(int[][] grid) {
            if (grid == null) return 0;
            int row = grid.length;
            int col = grid[0].length;
            int[][] dp = new int[row][col];
            dp[0][0] = grid[0][0];
            // 第一行
            for (int j = 1; j < col; j++) dp[0][j] = dp[0][j - 1] + grid[0][j];
            // 第一列
            for (int i = 1; i < row; i++) dp[i][0] = dp[i - 1][0] + grid[i][0];
            for (int i = 1; i < row; i++) {
                for (int j = 1; j < col; j++) {
                    dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
                }
            }
            return dp[row - 1][col - 1];
        }
    }
    

    自顶向下

    class Solution:
        def minPathSum(self, grid: List[List[int]]) -> int:
            import functools
            if not grid: return 0
            row = len(grid)
            col = len(grid[0])
            @functools.lru_cache(None)
            def helper(i,j):
                if i == row - 1 and j == col - 1:
                    return grid[i][j]
                if i >= row or j >= col:
                    return float("inf")
                tmp = 0
                tmp += grid[i][j] + min(helper(i, j+1), helper(i+1, j))
                return tmp
            return helper(0, 0)
    
  • 相关阅读:
    保护模式下通过写显存在屏幕上输出字符串
    Linux0.01 引导代码分析-head.s
    OpenGL Super Bible 第四章 Transform 程序绘图部分代码解析
    Ubuntu10.04 下编译 OpenOffice DEV300 分支
    今天把博客开通了,欢迎来访!
    沟通的工具ER图
    为什么博客叫秋水?
    mysql.基础笔记
    如何阅读别人的C代码
    Github搜索与查看
  • 原文地址:https://www.cnblogs.com/powercai/p/10919530.html
Copyright © 2011-2022 走看看