leetcode-64. 最小路径和 · vector + DP
题面
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.
给定二维数组,从(0, 0)开始,只能向右和向下走,找到最小的路径和。
样例
Input:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
Output: 7
Explanation: Because the path 1→3→1→1→1 minimizes the sum.
思路
动态规划,打表。我们就模拟移动的路径。我们需要一个二维数组来存储每一步的路径值。
可以在原来二维数组基础上,直接进行操作。
第一排只能向右走得到;第一列只能向下走得到。
其他的就要参考它的上边元素值和左边元素值,取小在加上它本身,更新成为它。(因为要最小路径,所以我们要确保每一步都最小)
算法
1. 遍历第一行,当前元素值为它左边元素加上它本身(只能从左边向右边走);
2. 遍历第一列,当前元素值为它上边元素加上它本身(只能从上边向下边走);
3. 遍历二维数组其他元素,当前值为上边元素与左边元素最小值加上它本身;
4. 返回右下角元素,即是结果。
时间复杂度:O(n2)
空间复杂度:O(n2)
源码
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int row = grid.size(), col = grid[].size();
if(row == )
return ;
for(int i=; i<col; i++)
{
grid[][i] += grid[][i-];
}
for(int i=; i<row; i++)
{
grid[i][] += grid[i-][];
}
for(int i=; i<row; i++)
{
for(int j=; j<col; j++)
{
grid[i][j] += min(grid[i][j-], grid[i-][j]);
}
}
return grid[row-][col-];
}
};
优化:空间压缩
其实,我们在做的过程当中,一直在做行处理,即一直在更新某一行(更新完这一行就转向下一行)。那么,我们只需要一个一维数组即可解决这个问题。
这样一来,空间就压缩到了O(n),时间复杂度不变。

(1-压缩后的;2-压缩前的)似乎空间占用也没有多大变化,但是我们确实做了空间压缩。
空间压缩源码
只用一维数组在存储状态,就要重新推导一下更新的状态方程
第一行:dp[0] = grid[0][0]
dp[i] = grid[0][i] + dp[i-1]
其他行:dp[0] = grid[i][0] + dp[0]
dp[j] = grid[i][j] + min(dp[j-1], dp[j])
int minPathSum(vector<vector<int>>& grid) {
int row = grid.size(), col = grid[].size();
if(row == )
return ;
vector<int> dp(col, );//只要额外一维数组的空间,上一种做法,如果不原地使用原来二位数组的话,就只能额外开二维数组。
dp[] = grid[][];
for(int i=; i<col; i++)
{
dp[i] = dp[i-] + grid[][i];
}
for(int i=; i<row; i++)
{
dp[] += grid[i][];
for(int j=; j<col; j++)
{
dp[j] = min(dp[j-], dp[j]) + grid[i][j];
}
}
return dp[col-];
}
leetcode-64. 最小路径和 · vector + DP的更多相关文章
- leetcode 64. 最小路径和 动态规划系列
目录 1. leetcode 64. 最小路径和 1.1. 暴力 1.2. 二维动态规划 2. 完整代码及执行结果 2.1. 执行结果 1. leetcode 64. 最小路径和 给定一个包含非负整数 ...
- LeetCode 64. 最小路径和(Minimum Path Sum) 20
64. 最小路径和 64. Minimum Path Sum 题目描述 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明: 每次只能向下或 ...
- Java实现 LeetCode 64 最小路径和
64. 最小路径和 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例: 输入: [ [1,3,1], ...
- [LeetCode] 64. 最小路径和 ☆☆☆(动态规划)
描述 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例: 输入:[ [1,3,1], [1,5,1 ...
- [LeetCode]64. 最小路径和(DP)
题目 给定一个无序的整数数组,找到其中最长上升子序列的长度. 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4 ...
- LeetCode 64最小路径和
题目 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例: 输入: [ [1,3,1], [1,5 ...
- leetcode 64. 最小路径和Minimum Path Sum
很典型的动态规划题目 C++解法一:空间复杂度n2 class Solution { public: int minPathSum(vector<vector<int>>&am ...
- Leetcode——64. 最小路径和
题目描述:题目链接 同样对于这个问题,我们可以考虑用动态规划来解决. 解决动态规划常见的三个步骤: 1:问题的归纳.对于 i,j 位置上的最短路径可以用d[ i ][ j ]表示. 2:归纳递推式:d ...
- Leetcode之动态规划(DP)专题-64. 最小路径和(Minimum Path Sum)
Leetcode之动态规划(DP)专题-64. 最小路径和(Minimum Path Sum) 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. ...
随机推荐
- iOS-代理设计模式delegate和protocol
充当代理的步骤: 首先要明确谁请别人代理,谁当别人的代理 1> 请代理三部曲: 1 写一个协议protoc,把自己不方便做的事列出来(@protocol studentDelegate < ...
- XenServer 根分区空间满的解决办法
1.清除已经应用的旧补丁文件 删除 /var/patch/ 下的除 applied 之外的所有文件 2.清除旧版的Xen-Tools文件 删除 /opt/xensource/packages/iso/ ...
- Egret入门学习日记 --- 第十八篇(书中 8.5~8.7 节 内容)
第十八篇(书中 8.5~8.7 节 内容) 其实语法篇,我感觉没必要写录入到日记里. 我也犹豫了好久,到底要不要录入. 这样,我先读一遍语法篇的所有内容,我觉得值得留下的,我就录入日记里. 不然像昨天 ...
- Mac下用apache搭建一个局域网服务器
一:由于MacOX系统下自带Apache环境,所以我们在Mac系统下用Apache配置. Mac系统:10.14.4 二:启动Apache 启动 在终端输入:sudo apachectl start验 ...
- 帝国cms 批量替换语句
UPDATE www_92game_net_cnys_ecms_caipu SET titlepic=REPLACE(titlepic,'http://file.92game.net', '') ; ...
- easyui中combobox下拉内容进行分组
需求:对combobox下拉内容进行分组. 效果样式: 代码: valueField:'paymethod_name', textField:'paymethod_name', data:[{ &qu ...
- 学习笔记:yaml语言教程
目录 1.YAML基本概念 1.1 简介 1.2 基本语法 1.3 支持的数据结构: 1.4 注意点 2.数据结构 2.1 字典 2.2 数组 2.3 纯量 2.4 强制类型转换,双! 2.5 字符串 ...
- coverage代码覆盖率的使用~~
我们看下代码覆盖率的统计~,这个不必太揪心,觉得可以帮助你优化代码,可以看看,也不要带在意~ 1.先在cmd命令窗口在线安装coverage pip install coverage 2.安装完毕后我 ...
- JS将本地图片转化成base64码
在图片上传的时候,有时候后台需要前台上传base64文件,这时候我们就需要将图片资源转化成base64,下面这段js代码就可实现此功能. 1.首先在html里定义一个input输入框: BASE64图 ...
- Java中 final和static解析
一.final 根据程序上下文环境,Java关键字final有"这是无法改变的"或者"终态的"含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理 ...