博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode 64最小路径和
阅读量:5298 次
发布时间:2019-06-14

本文共 1392 字,大约阅读时间需要 4 分钟。

题目

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

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

示例:

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

解释

此题运用的是动态规划, 而且和很多题目非常相似,题目要求每次只能向下走一步或者向右走一步。这就规定走到这一个点的路径只有两点,就是上面的点和左边的点。所以每一点的最小cost可以表示为

min(到达上面的点的最小cost, 到达左边的点的最小cost) + 当前点的 cost

这样就把问题分成子问题,创建一个二维数组cost用来保存到达每一点的最小cost。

递归式可以表示为

cost[i][j] = min(cost[i][j - 1] + grid[i][j], cost[i - 1][j] + grid[i][j]);

然后利用一个二层循环,把到达每一个点的最小值求出来。返回返回右下角的值即可。

代码

int minPathSum(vector
>& grid) { vector
> cost = grid; int n = grid.size(), m = grid[0].size(); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { //处理第一行和第一列的情况,如果不处理的话,数组会越界 if (i == 0) { //一直向右走 cost[i][j] = cost[i][j - 1] + grid[i][j]; } else if (j == 0) { //一直向下走 cost[i][j] = cost[i - 1][j] + grid[i][j]; } else { //利用递推式求结果 cost[i][j] = min(cost[i][j - 1] + grid[i][j], cost[i - 1][j] + grid[i][j]); } } } //返回右下角值 return cost[n-1][m-1]; }

总结

  • 关键的一点就是找出递推式。看当前最优解能否被前面的值推出
  • 存储原来的数据一般可以用一个二维数组。但是有一些题目对空间有限制。比如LeetCode 413, 这样的话就要尽量去优化,看能不能用一维数组来代替。

类似题目

LeetCode 877

转载于:https://www.cnblogs.com/qq874455953/p/9901064.html

你可能感兴趣的文章
一步步教你轻松学奇异值分解SVD降维算法
查看>>
使用pager进行分页
查看>>
UVA - 1592 Database
查看>>
Fine Uploader文件上传组件
查看>>
javascript中的传递参数
查看>>
objective-c overview(二)
查看>>
python查询mangodb
查看>>
consonant combination
查看>>
驱动的本质
查看>>
Swift的高级分享 - Swift中的逻辑控制器
查看>>
Swagger简单介绍
查看>>
sql语句中where与having的区别
查看>>
Python数据分析入门案例
查看>>
vue-devtools 获取到 vuex store 和 Vue 实例的?
查看>>
Linux 中【./】和【/】和【.】之间有什么区别?
查看>>
内存地址对齐
查看>>
看门狗 (监控芯片)
查看>>
#ifndef #define #endif
查看>>
css背景样式
查看>>
JavaScript介绍
查看>>