File tree 5 files changed +93
-34
lines changed
solution/0000-0099/0064.Minimum Path Sum
5 files changed +93
-34
lines changed Original file line number Diff line number Diff line change 191
191
- [ 二维区域和检索 - 矩阵不可变] ( ./solution/0300-0399/0304.Range%20Sum%20Query%202D%20-%20Immutable/README.md )
192
192
- [ 不同路径] ( ./solution/0000-0099/0062.Unique%20Paths/README.md )
193
193
- [ 不同路径 II] ( ./solution/0000-0099/0063.Unique%20Paths%20II/README.md )
194
- - [ 礼物的最大价值] ( ./lcof/面试题47.%20礼物的最大价值/README.md )
195
194
- [ 最小路径和] ( ./solution/0000-0099/0064.Minimum%20Path%20Sum/README.md )
195
+ - [ 礼物的最大价值] ( ./lcof/面试题47.%20礼物的最大价值/README.md )
196
196
- [ 最长上升子序列] ( ./solution/0300-0399/0300.Longest%20Increasing%20Subsequence/README.md )
197
197
- [ 俄罗斯套娃信封问题] ( ./solution/0300-0399/0354.Russian%20Doll%20Envelopes/README.md )
198
198
- [ 最长公共子序列] ( ./solution/1100-1199/1143.Longest%20Common%20Subsequence/README.md )
Original file line number Diff line number Diff line change 42
42
43
43
<!-- 这里可写通用的实现逻辑 -->
44
44
45
- 动态规划法。
45
+ 动态规划。假设 ` dp[i][j] ` 表示到达网格 ` (i,j) ` 的最小数字和,先初始化 dp 第一列和第一行的所有值,然后利用递推公式:` dp[i][j] = min(dp[i -1][j], dp[i][j - 1]) + grid[i][j] ` 求得 dp。
46
+
47
+ 最后返回 ` dp[m - 1][n - 1] ` 即可。
46
48
47
49
<!-- tabs:start -->
48
50
@@ -61,8 +63,8 @@ class Solution:
61
63
dp[0 ][j] = dp[0 ][j - 1 ] + grid[0 ][j]
62
64
for i in range (1 , m):
63
65
for j in range (1 , n):
64
- dp[i][j] = min (dp[i - 1 ][j], dp[i][j - 1 ]) + grid[i][j]
65
- return dp[m - 1 ][n - 1 ]
66
+ dp[i][j] = min (dp[i - 1 ][j], dp[i][j - 1 ]) + grid[i][j]
67
+ return dp[- 1 ][- 1 ]
66
68
```
67
69
68
70
### ** Java**
@@ -115,6 +117,38 @@ public:
115
117
};
116
118
```
117
119
120
+ ### **Go**
121
+
122
+ ```go
123
+ func minPathSum(grid [][]int) int {
124
+ m, n := len(grid), len(grid[0])
125
+ dp := make([][]int, m)
126
+ for i := 0; i < m; i++ {
127
+ dp[i] = make([]int, n)
128
+ }
129
+ dp[0][0] = grid[0][0]
130
+ for i := 1; i < m; i++ {
131
+ dp[i][0] = dp[i-1][0] + grid[i][0]
132
+ }
133
+ for j := 1; j < n; j++ {
134
+ dp[0][j] = dp[0][j-1] + grid[0][j]
135
+ }
136
+ for i := 1; i < m; i++ {
137
+ for j := 1; j < n; j++ {
138
+ dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]
139
+ }
140
+ }
141
+ return dp[m-1][n-1]
142
+ }
143
+
144
+ func min(a, b int) int {
145
+ if a < b {
146
+ return a
147
+ }
148
+ return b
149
+ }
150
+ ```
151
+
118
152
### ** ...**
119
153
120
154
```
Original file line number Diff line number Diff line change 36
36
37
37
## Solutions
38
38
39
+ Dynamic programming.
40
+
39
41
<!-- tabs:start -->
40
42
41
43
### ** Python3**
@@ -51,8 +53,8 @@ class Solution:
51
53
dp[0 ][j] = dp[0 ][j - 1 ] + grid[0 ][j]
52
54
for i in range (1 , m):
53
55
for j in range (1 , n):
54
- dp[i][j] = min (dp[i - 1 ][j], dp[i][j - 1 ]) + grid[i][j]
55
- return dp[m - 1 ][n - 1 ]
56
+ dp[i][j] = min (dp[i - 1 ][j], dp[i][j - 1 ]) + grid[i][j]
57
+ return dp[- 1 ][- 1 ]
56
58
```
57
59
58
60
### ** Java**
@@ -103,6 +105,38 @@ public:
103
105
};
104
106
```
105
107
108
+ ### **Go**
109
+
110
+ ```go
111
+ func minPathSum(grid [][]int) int {
112
+ m, n := len(grid), len(grid[0])
113
+ dp := make([][]int, m)
114
+ for i := 0; i < m; i++ {
115
+ dp[i] = make([]int, n)
116
+ }
117
+ dp[0][0] = grid[0][0]
118
+ for i := 1; i < m; i++ {
119
+ dp[i][0] = dp[i-1][0] + grid[i][0]
120
+ }
121
+ for j := 1; j < n; j++ {
122
+ dp[0][j] = dp[0][j-1] + grid[0][j]
123
+ }
124
+ for i := 1; i < m; i++ {
125
+ for j := 1; j < n; j++ {
126
+ dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]
127
+ }
128
+ }
129
+ return dp[m-1][n-1]
130
+ }
131
+
132
+ func min(a, b int) int {
133
+ if a < b {
134
+ return a
135
+ }
136
+ return b
137
+ }
138
+ ```
139
+
106
140
### ** ...**
107
141
108
142
```
Original file line number Diff line number Diff line change 1
-
2
1
func minPathSum (grid [][]int ) int {
3
- yl := len (grid )
4
- if yl == 0 {
5
- return 0
6
- }
7
- xl := len (grid [0 ])
8
- if xl == 0 {
9
- return 0
10
- }
11
- // malloc
12
- dp := make ([][]int , yl )
13
- for i , _ := range dp {
14
- dp [i ] = make ([]int , xl )
2
+ m , n := len (grid ), len (grid [0 ])
3
+ dp := make ([][]int , m )
4
+ for i := 0 ; i < m ; i ++ {
5
+ dp [i ] = make ([]int , n )
15
6
}
16
7
dp [0 ][0 ] = grid [0 ][0 ]
17
- for i := 1 ; i < yl ; i ++ {
18
- dp [i ][0 ] = grid [ i ][0 ] + dp [ i - 1 ][0 ]
8
+ for i := 1 ; i < m ; i ++ {
9
+ dp [i ][0 ] = dp [ i - 1 ][0 ] + grid [ i ][0 ]
19
10
}
20
- for j := 1 ; j < xl ; j ++ {
21
- dp [0 ][j ] = grid [0 ][j ] + dp [0 ][j - 1 ]
11
+ for j := 1 ; j < n ; j ++ {
12
+ dp [0 ][j ] = dp [0 ][j - 1 ] + grid [0 ][j ]
22
13
}
23
- for i := 1 ; i < yl ; i ++ {
24
- for j := 1 ; j < xl ; j ++ {
25
- dp [i ][j ] = grid [ i ][ j ] + minInt (dp [i - 1 ][j ], dp [i ][j - 1 ])
14
+ for i := 1 ; i < m ; i ++ {
15
+ for j := 1 ; j < n ; j ++ {
16
+ dp [i ][j ] = min (dp [i - 1 ][j ], dp [i ][j - 1 ]) + grid [ i ][ j ]
26
17
}
27
18
}
28
- return dp [yl - 1 ][xl - 1 ]
19
+ return dp [m - 1 ][n - 1 ]
29
20
}
30
21
31
- func minInt ( x , y int ) int {
32
- if x < y {
33
- return x
22
+ func min ( a , b int ) int {
23
+ if a < b {
24
+ return a
34
25
}
35
- return y
36
- }
26
+ return b
27
+ }
Original file line number Diff line number Diff line change @@ -8,5 +8,5 @@ def minPathSum(self, grid: List[List[int]]) -> int:
8
8
dp [0 ][j ] = dp [0 ][j - 1 ] + grid [0 ][j ]
9
9
for i in range (1 , m ):
10
10
for j in range (1 , n ):
11
- dp [i ][j ] = min (dp [i - 1 ][j ], dp [i ][j - 1 ]) + grid [i ][j ]
12
- return dp [m - 1 ][n - 1 ]
11
+ dp [i ][j ] = min (dp [i - 1 ][j ], dp [i ][j - 1 ]) + grid [i ][j ]
12
+ return dp [- 1 ][- 1 ]
You can’t perform that action at this time.
0 commit comments