• 最小路径和


    题目描述:

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

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

    示例:

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

    解题思路:

    创建二维数组dp,与原始网格的大小相同,dp[i][j] 表示从左上角出发到 (i,j)位置的最小路径和。显然,dp[0][0] = grid[0][0]。对于 dp 中的其余元素,通过以下状态转移方程计算元素值。

    • 当 i>0 且 j=0 时,dp[i][0] = dp[i-1][0] + grid[i][0] 即求第一行结果
    • 当 j>0 且 i=0 时,dp[0][j] = dp[0][j-1] + grid[0][j] 即求第一列结果
    • 当 i>0 且j>0 时,dp[i][j] = Min(dp[i-1][j], dp[i][j-1]) + grid[i][j] 即求剩余结果
      //go
      func minPathSum(grid [][]int) int {
       if grid == nil || len(grid) == 0 || len(grid[0]) == 0 {
        return 0
       }
       row, col := len(grid), len(grid[0])
       dp := make([][]int, row)
          for i := 0; i < len(dp); i++ {
              dp[i] = make([]int, col)
          }
       dp[0][0] = grid[0][0]
       for i := 1; i < row; i++ {
        dp[i][0] = dp[i-1][0] + grid[i][0]
       }
       for j := 1; j < col; j++ {
        dp[0][j] = dp[0][j-1] + grid[0][j]
       }
       for i := 1; i < row; i++ {
        for j := 1; j < col; j++ {
         dp[i][j] = Min(dp[i-1][j], dp[i][j-1]) + grid[i][j]
        }
       }
       return dp[row-1][col-1]
      }
      
      func Min(x, y int) int {
          if x < y {
              return x
          }
          return y
      }
      

        地址:https://mp.weixin.qq.com/s/zy8TYe3qwrZa0imUR9j7Qg

    small_lei_it 技术无止境,追求更高。
  • 相关阅读:
    git常用操作命令
    如何编写高质量代码
    Chrome调试工具简单介绍
    使用eclipse+tomcat搭建本地环境
    chrome设置--disable-web-security解决跨域
    利用Maven管理工程项目本地启动报错及解决方案
    用户输入验证【提升篇】
    简单【用户输入验证】
    【消息框】的返回值
    【消息框】的4种显示形式
  • 原文地址:https://www.cnblogs.com/smallleiit/p/13533162.html
Copyright © 2020-2023  润新知