-
-
Notifications
You must be signed in to change notification settings - Fork 55
/
Copy pathMazePathDiagonal.java
105 lines (76 loc) Β· 2.58 KB
/
MazePathDiagonal.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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package section19_DynamicProgramming;
import java.util.Arrays;
public class MazePathDiagonal {
public static void main(String[] args) {
int n = 500;
int cr = 0, cc = 0, er = n, ec = n;
// System.out.println(mazePathDiagonalRecursive(cr, cc, er, ec));
System.out.println(mazePathDiagonalTopDownDP(cr, cc, er, ec, new int[n + 1][n + 1]));
System.out.println(mazePathDiagBottomUpDP(er, ec));
System.out.println(mazePathDiagBottomUpSpaceEfficient(er, ec));
}
// O(3^(er + ec)) Time | recursion extra space
public static int mazePathDiagonalRecursive(int cr, int cc, int er, int ec) {
if (cr > er || cc > ec) {
return 0;
}
if (cr == er && cc == ec) {
return 1;
}
int horizontalCount = mazePathDiagonalRecursive(cr, cc + 1, er, ec);
int verticalCount = mazePathDiagonalRecursive(cr + 1, cc, er, ec);
int diagonalCount = mazePathDiagonalRecursive(cr + 1, cc + 1, er, ec);
int totalPaths = horizontalCount + verticalCount + diagonalCount;
return totalPaths;
}
// O(er*ec) Time | O(er*ec) Space + recursion extra space
public static int mazePathDiagonalTopDownDP(int cr, int cc, int er, int ec, int[][] storage) {
if (cr > er || cc > ec) {
return 0;
}
if (cr == er && cc == ec) {
return 1;
}
if (storage[cr][cc] != 0) {
return storage[cr][cc];
}
int horizontalCount = mazePathDiagonalTopDownDP(cr, cc + 1, er, ec, storage);
int verticalCount = mazePathDiagonalTopDownDP(cr + 1, cc, er, ec, storage);
int diagonalCount = mazePathDiagonalTopDownDP(cr + 1, cc + 1, er, ec, storage);
int totalPaths = horizontalCount + verticalCount + diagonalCount;
storage[cr][cc] = totalPaths;
return totalPaths;
}
// O(er*ec) Time | O(er*ec) Space
public static int mazePathDiagBottomUpDP(int er, int ec) {
int[][] storage = new int[er + 2][ec + 2];
for (int row = er; row >= 0; row--) {
for (int col = ec; col >= 0; col--) {
if (row == er && col == ec) {
storage[row][col] = 1;
} else {
storage[row][col] = storage[row][col + 1] + storage[row + 1][col] + storage[row + 1][col + 1];
}
}
}
return storage[0][0];
}
// O(er*ec) Time | O(ec) Space
public static int mazePathDiagBottomUpSpaceEfficient(int er, int ec) {
int[] storage = new int[ec + 1];
Arrays.fill(storage, 1);
for (int slide = er - 1; slide >= 0; slide--) {
int diagonalvalue = 1;
for (int col = ec; col >= 0; col--) {
if (col == ec) {
storage[col] = 1;
} else {
int sum = storage[col] + storage[col + 1] + diagonalvalue;
diagonalvalue = storage[col];
storage[col] = sum;
}
}
}
return storage[0];
}
}