• leetcode


    题目描述

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

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

    示例:

    输入:

    [
      [1,3,1],
      [1,5,1],
      [4,2,1]
    ]
    

    输出: 7
    解释: 因为路径 1→3→1→1→1 的总和最小。

    题解

    起先,这题我是来了一波深度搜索,我是抓牢一个点就是从左顶点往下走或者是往右走,在这之后我只选择最小的那个点走,试了下测试用例也还OK,提交了以后没有通过,我陷入了深思,发现我的脑容量还是不够大,too young too simple, sometimes naive. 后来也想到了这种方法有点危险,及时悔悟啊。。。

    排除掉m和n中有一个为0的情况,我们进行分类讨论。

    • 当m为0时,靠边上那一排单纯点往右边走,计算出每位选手的最小和
    • 当n为0时,靠边上那一列单纯点往下走,计算出每位选手的最小和
    • 排除楼上两种情况后,考虑中间任意点的最小和等于其自身加上和其自身相邻的左边那位或者上边那位的最小和的最小值

    最后,我们只要返回最后那个元素的最小和就好了。

    用Javascript语言的相关实现如下:

    /**
     * @param {number[][]} grid
     * @return {number}
     */
    var minPathSum = function (grid) {
      var row = grid.length;
      if (!row) return 0;
      var col = grid[row - 1].length;
      if (!col) return 0;
      var dp = [...grid];
      for (var i = 1; i < row; i++) {
        dp[i][0] = grid[i - 1][0] + grid[i][0];
      }
    
      for (var i = 1; i < col; i++) {
        dp[0][i] = grid[0][i - 1] + grid[0][i];
      }
    
      for(var i = 1; i < row; i++) {
        for (var j = 1; j < col; j++) {
          dp[i][j] = Math.min(grid[i - 1][j], grid[i][j - 1]) + grid[i][j];
        }
      }
    
      return dp[row - 1][col - 1];
    };
    
    

    emmmm, 这里提及一下,在JS中数组是引用类型的,所以你要用深拷贝来解决数组拷贝问题。

    代码地址: https://zhengjiangtao.cn/coding/interview/min_path_sum.js

    项目地址: https://github.com/ataola/coding

    参考文献

    leetcode - 最小路径和: https://leetcode-cn.com/problems/minimum-path-sum

    知识共享许可协议
    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

  • 相关阅读:
    并查集模板
    143. 最大异或对(Trie树存整数+二进制)
    Trie树模板
    835. 字符串统计(Trie树模板题)
    生兔兔
    汉诺塔问题
    一本通 1296:开餐馆
    一本通 1272:【例9.16】分组背包
    一本通 1292:宠物小精灵之收服
    一本通 1271:【例9.15】潜水员
  • 原文地址:https://www.cnblogs.com/cnroadbridge/p/13369668.html
Copyright © 2020-2023  润新知