Skip to content

Commit 76074d1

Browse files
committed
🎉 add: 最小路径和
1 parent 6bff3a0 commit 76074d1

File tree

6 files changed

+179
-0
lines changed

6 files changed

+179
-0
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,8 @@
189189

190190
- [动态规划-概览](/算法分类/动态规划/动态规划.md)
191191
- [斐波拉契数列](/算法分类/递归和循环/斐波拉契数列.md)⭐⭐
192+
- [最小路径和](/算法分类/动态规划/最小路径和.md)⭐⭐⭐
193+
192194

193195
## 贪心算法
194196

docs/.vuepress/config.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ module.exports = {
108108
title: '动态规划',
109109
children: [
110110
'/algorithm/动态规划/动态规划',
111+
'/algorithm/动态规划/最小路径和',
111112
]
112113
},
113114
{

docs/algorithm/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@
6565

6666
- [动态规划-概览](./动态规划/动态规划.md)
6767
- [斐波拉契数列](./递归和循环/斐波拉契数列.md)⭐⭐
68+
- [最小路径和](./动态规划/最小路径和.md)⭐⭐⭐
69+
6870

6971
## 贪心算法
7072

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
---
2+
{
3+
"title": "最小路径和",
4+
}
5+
---
6+
7+
## 题目
8+
9+
给定一个包含非负整数的 `m x n` 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
10+
11+
说明:每次只能向下或者向右移动一步。
12+
13+
示例:
14+
```js
15+
输入:
16+
[
17+
  [1,3,1],
18+
[1,5,1],
19+
[4,2,1]
20+
]
21+
输出: 7
22+
解释: 因为路径 13111 的总和最小。
23+
```
24+
25+
## 思路
26+
27+
新建一个额外的 dpdp 数组,与原矩阵大小相同。在这个矩阵中,`dp(i, j)dp(i,j)` 表示从坐标 `(i, j)(i,j)` 到右下角的最小路径权值。
28+
29+
我们初始化右下角的 `dpdp` 值为对应的原矩阵值,然后去填整个矩阵,对于每个元素考虑移动到右边或者下面,因此获得最小路径和我们有如下递推公式:
30+
31+
```js
32+
dp(i,j)=grid(i,j)+min(dp(i+1,j),dp(i,j+1))
33+
```
34+
35+
36+
时间复杂度 :`O(mn)O(mn)`
37+
空间复杂度 :`O(mn)O(mn)`
38+
39+
## 代码
40+
41+
```js
42+
var minPathSum = function (grid) {
43+
var m = grid.length;
44+
var n = grid[0].length;
45+
for (var i = 0; i < m; i++) {
46+
for (var j = 0; j < n; j++) {
47+
if (i === 0 && j !== 0) {
48+
grid[i][j] += grid[i][j - 1];
49+
} else if (j === 0 && i !== 0) {
50+
grid[i][j] += grid[i - 1][j];
51+
} else if (i !== 0 && j !== 0) {
52+
grid[i][j] += Math.min(grid[i - 1][j], grid[i][j - 1]);
53+
}
54+
}
55+
}
56+
return grid[m - 1][n - 1];
57+
};
58+
```
59+
60+
## 考察点
61+
62+
- 动态规划

leetcode/64.最小路径和.md

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
## 题目
2+
3+
给定一个包含非负整数的 `m x n` 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
4+
5+
说明:每次只能向下或者向右移动一步。
6+
7+
示例:
8+
```js
9+
输入:
10+
[
11+
  [1,3,1],
12+
[1,5,1],
13+
[4,2,1]
14+
]
15+
输出: 7
16+
解释: 因为路径 13111 的总和最小。
17+
```
18+
19+
## 思路
20+
21+
新建一个额外的 dpdp 数组,与原矩阵大小相同。在这个矩阵中,`dp(i, j)dp(i,j)` 表示从坐标 `(i, j)(i,j)` 到右下角的最小路径权值。
22+
23+
我们初始化右下角的 `dpdp` 值为对应的原矩阵值,然后去填整个矩阵,对于每个元素考虑移动到右边或者下面,因此获得最小路径和我们有如下递推公式:
24+
25+
```js
26+
dp(i,j)=grid(i,j)+min(dp(i+1,j),dp(i,j+1))
27+
```
28+
29+
30+
时间复杂度 :`O(mn)O(mn)`
31+
空间复杂度 :`O(mn)O(mn)`
32+
33+
## 代码
34+
35+
```js
36+
var minPathSum = function (grid) {
37+
var m = grid.length;
38+
var n = grid[0].length;
39+
for (var i = 0; i < m; i++) {
40+
for (var j = 0; j < n; j++) {
41+
if (i === 0 && j !== 0) {
42+
grid[i][j] += grid[i][j - 1];
43+
} else if (j === 0 && i !== 0) {
44+
grid[i][j] += grid[i - 1][j];
45+
} else if (i !== 0 && j !== 0) {
46+
grid[i][j] += Math.min(grid[i - 1][j], grid[i][j - 1]);
47+
}
48+
}
49+
}
50+
return grid[m - 1][n - 1];
51+
};
52+
```
53+
54+
## 考察点
55+
56+
- 动态规划
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
## 题目
2+
3+
给定一个包含非负整数的 `m x n` 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
4+
5+
说明:每次只能向下或者向右移动一步。
6+
7+
示例:
8+
```js
9+
输入:
10+
[
11+
  [1,3,1],
12+
[1,5,1],
13+
[4,2,1]
14+
]
15+
输出: 7
16+
解释: 因为路径 13111 的总和最小。
17+
```
18+
19+
## 思路
20+
21+
新建一个额外的 dpdp 数组,与原矩阵大小相同。在这个矩阵中,`dp(i, j)dp(i,j)` 表示从坐标 `(i, j)(i,j)` 到右下角的最小路径权值。
22+
23+
我们初始化右下角的 `dpdp` 值为对应的原矩阵值,然后去填整个矩阵,对于每个元素考虑移动到右边或者下面,因此获得最小路径和我们有如下递推公式:
24+
25+
```js
26+
dp(i,j)=grid(i,j)+min(dp(i+1,j),dp(i,j+1))
27+
```
28+
29+
30+
时间复杂度 :`O(mn)O(mn)`
31+
空间复杂度 :`O(mn)O(mn)`
32+
33+
## 代码
34+
35+
```js
36+
var minPathSum = function (grid) {
37+
var m = grid.length;
38+
var n = grid[0].length;
39+
for (var i = 0; i < m; i++) {
40+
for (var j = 0; j < n; j++) {
41+
if (i === 0 && j !== 0) {
42+
grid[i][j] += grid[i][j - 1];
43+
} else if (j === 0 && i !== 0) {
44+
grid[i][j] += grid[i - 1][j];
45+
} else if (i !== 0 && j !== 0) {
46+
grid[i][j] += Math.min(grid[i - 1][j], grid[i][j - 1]);
47+
}
48+
}
49+
}
50+
return grid[m - 1][n - 1];
51+
};
52+
```
53+
54+
## 考察点
55+
56+
- 动态规划

0 commit comments

Comments
 (0)