-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMinPathFinder.java
57 lines (42 loc) · 1.4 KB
/
MinPathFinder.java
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
package org.sean.recursive;
// 64. Minimum Path Sum
public class MinPathFinder {
// add a result cache
private int[][] marks;
private int row;
private int column;
public int minPathSum(int[][] grid) {
if (grid == null || grid.length == 0) return 0;
if (grid.length == 1 && grid[0].length == 1) return grid[0][0];
// m
row = grid.length;
// n
column = grid[0].length;
marks = new int[row][column];
return calcMinSum(grid, row - 1, column - 1);
}
private int calcMinSum(int[][] grid, int row, int column) {
if (row < 0 || column < 0) {
return -1; // non-negative values for each cell
}
if (marks[row][column] != 0) {
return marks[row][column];
}
if (row == 0 && column == 0) {
return grid[0][0];
}
int sumMin = grid[row][column];
int topResult = calcMinSum(grid, row - 1, column);
int leftResult = calcMinSum(grid, row, column - 1);
int subMin;
if (topResult >= 0 && leftResult >= 0) {
// Calling method Math.min() takes extra time!
subMin = leftResult < topResult ? leftResult : topResult;
} else {
subMin = topResult < 0 ? leftResult : topResult;
}
int sum = sumMin + subMin;
marks[row][column] = sum;
return sum;
}
}