-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathLeetCode-64-Minimum-Path-Sum.java
More file actions
79 lines (63 loc) · 2.4 KB
/
LeetCode-64-Minimum-Path-Sum.java
File metadata and controls
79 lines (63 loc) · 2.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/*
LeetCode: https://leetcode.com/problems/minimum-path-sum/
LintCode: http://www.lintcode.com/problem/minimum-path-sum/
JiuZhang: http://www.jiuzhang.com/solutions/minimum-path-sum/
ProgramCreek: http://www.programcreek.com/2014/05/leetcode-minimum-path-sum-java/
Analysis:
DP
*/
public class Solution {
// Recursive (will TLE)
// public int minPathSum(int[][] grid) {
// if (grid == null || grid.length == 0) return 0;
// return helper(grid, grid.length - 1, grid[0].length - 1);
// }
// private int helper(int[][] grid, int x, int y) {
// if (x == 0 && y == 0) return grid[0][0];
// if (x == 0) {
// return grid[0][y] + helper(grid, 0, y - 1);
// } else if (y == 0) {
// return grid[x][0] + helper(grid, x - 1, 0);
// } else {
// return grid[x][y] + Math.min(helper(grid, x, y - 1), helper(grid, x - 1, y));
// }
// }
// 1. DP, Time O(M*N), Space O(M*N)
// public int minPathSum(int[][] grid) {
// if (grid == null) return 0;
// int n = grid.length, m = grid[0].length;
// if (m == 1 && n == 1) return grid[0][0];
// int[][] path = new int[n][m];
// path[0][0] = grid[0][0];
// for (int i = 1; i < n; i++) {
// path[i][0] = path[i - 1][0] + grid[i][0];
// }
// for (int j = 1; j < m; j++) {
// path[0][j] = path[0][j - 1] + grid[0][j];
// }
// for (int i = 1; i < n; i++) {
// for (int j = 1; j < m; j++) {
// path[i][j] = Math.min(path[i - 1][j], path[i][j - 1]) + grid[i][j];
// }
// }
// return path[n - 1][m - 1];
// }
// 2. DP, inplace, Time O(M*N), Space O(M*N)
public int minPathSum(int[][] grid) {
if (grid == null) return 0;
int n = grid.length, m = grid[0].length;
if (m == 1 && n == 1) return grid[0][0];
for (int i = 1; i < n; i++) {
grid[i][0] += grid[i - 1][0];
}
for (int j = 1; j < m; j++) {
grid[0][j] += grid[0][j - 1];
}
for (int i = 1; i < n; i++) {
for (int j = 1; j < m; j++) {
grid[i][j] = Math.min(grid[i - 1][j], grid[i][j - 1]) + grid[i][j];
}
}
return grid[n - 1][m - 1];
}
}