前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >leetcode - 最小路径和

leetcode - 最小路径和

作者头像
江涛学编程
发布2020-07-29 17:24:21
3460
发布2020-07-29 17:24:21
举报
文章被收录于专栏:江涛的博客江涛的博客

题目描述

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

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

示例:

输入:

代码语言:javascript
复制
[
  [1,3,1],
  [1,5,1],
  [4,2,1]
]

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

题解

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

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

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

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

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

代码语言: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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 江涛学编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
  • 示例:
  • 题解
  • 参考文献
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档