zoukankan      html  css  js  c++  java
  • [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.

    最小路径和。题意是给一个二维矩阵,每个格子上都有一个非负整数。请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

    这是动态规划的入门题。DP[i][j]的含义是代表走到坐标(i, j)位置的最小路径和。初始状态dp[0][0] = grid[0][0],因为对于某一个坐标来说,只会是从上面一个单元格或者是左边的一个单元格过来,所以转移方程是dp[i][j] = min(dp[i−1][j], dp[i][j−1]) + grid[i][j]。

    时间O(mn)

    空间O(1)

    Java实现

     1 class Solution {
     2     public int minPathSum(int[][] grid) {
     3         int m = grid.length;
     4         int n = grid[0].length;
     5         int[][] dp = new int[m][n];
     6         dp[0][0] = grid[0][0];
     7         for (int i = 1; i < m; i++) {
     8             dp[i][0] = dp[i - 1][0] + grid[i][0];
     9         }
    10         
    11         for (int j = 1; j < n; j++) {
    12             dp[0][j] = dp[0][j - 1] + grid[0][j];
    13         }
    14         
    15         for (int i = 1; i < m; i++) {
    16             for (int j = 1; j < n; j++) {
    17                 dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
    18             }
    19         }
    20         return dp[m - 1][n - 1];
    21     }
    22 }

    JavaScript实现

     1 /**
     2  * @param {number[][]} grid
     3  * @return {number}
     4  */
     5 var minPathSum = function (grid) {
     6     for (let i = 0; i < grid.length; i++) {
     7         for (let j = 0; j < grid[0].length; j++) {
     8             if (i == 0 && j != 0) {
     9                 grid[i][j] += grid[i][j - 1];
    10             }
    11             if (j == 0 && i != 0) {
    12                 grid[i][j] += grid[i - 1][j];
    13             }
    14             if (i != 0 && j != 0) {
    15                 grid[i][j] += Math.min(grid[i - 1][j], grid[i][j - 1]);
    16             }
    17         }
    18     }
    19     return grid[grid.length - 1][grid[0].length - 1];
    20 };

    相关题目

    62. Unique Paths

    63. Unique Paths II

    64. Minimum Path Sum

    LeetCode 题目总结

  • 相关阅读:
    childNodes.length和form.length的不同
    外部样式表声明的样式并不会进入style对象
    js之insertBefore(newElement,oldElement)
    文字不换行,超出部分显示成省略号
    animation和transition做动画的区别
    html中隐藏一个元素的方法
    css常见属性和属性值
    css选择器的优先级
    frameset怎么框架内部跳转
    form表单标签及属性的介绍
  • 原文地址:https://www.cnblogs.com/cnoodle/p/12545248.html
Copyright © 2011-2022 走看看