zoukankan      html  css  js  c++  java
  • 最小路径和

    题目描述:

    给定一个包含非负整数的 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 技术无止境,追求更高。
  • 相关阅读:
    Leetcode 204. Count Primes
    Leetcode 263. Ugly Number
    Leetcode 202. Happy Number
    Leetcode 258. Add Digits
    Leetcode 23. Merge k Sorted Lists
    BAT 批处理脚本教程
    入门训练 序列求和
    JAVA学习:方法
    大小之差
    java中length,length(),size()区别
  • 原文地址:https://www.cnblogs.com/smallleiit/p/13533162.html
Copyright © 2011-2022 走看看