-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path403. Frog Jump.cpp
87 lines (71 loc) · 2.6 KB
/
403. Frog Jump.cpp
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
/************Method-1(Bottom-Up, Gives TLE, TC - O(n^2), SC - O(N^2))***************
class Solution {
public:
bool canCross(vector<int>& stones) {
if(stones[1] != 1)
return false;
int n = stones.size();
unordered_map<int, int> m;
vector<vector<bool>> dp(n, vector<bool>(n+1, false));
// Populate the map and fill the base case
for(int i = 0; i < n; i++) {
m[stones[i]] = i;
dp[n-1][i+1] = true;
}
// DP table
for(int i = n-2; i >= 1; i--) {
for(int j = 1; j <= n; j++) {
// 3 cases
// j-1
if(j> 1 && m.find(stones[i]+j-1) != m.end())
dp[i][j] = dp[i][j] || dp[m[stones[i]+j-1]][j-1];
// j
if(m.find(stones[i]+j) != m.end())
dp[i][j] = dp[i][j] || dp[m[stones[i]+j]][j];
// j+1
if(m.find(stones[i]+j+1) != m.end())
dp[i][j] = dp[i][j] || dp[m[stones[i]+j+1]][j+1];
}
}
return dp[1][1];
}
};
******************************************************************************************/
/************Method-1(Top-Down, TC - O(n^2), SC - O(N^2))*********************************/
class Solution {
public:
int canCrossHelper(unordered_map<int, int>&m, vector<vector<int>> &dp, int i, int j, vector<int> &stones) {
int n = stones.size();
// Base case
if(i == n-1)
return 1;
// DP state
if(dp[i][j] != -1)
return dp[i][j];
// Recursive call
int t1 = 0, t2 = 0, t3 = 0;
// 3 cases
// j-1
if(j> 1 && m.find(stones[i]+j-1) != m.end())
t1 = canCrossHelper(m, dp, m[stones[i]+j-1], j-1, stones);
// j
if(m.find(stones[i]+j) != m.end())
t2 = canCrossHelper(m, dp, m[stones[i]+j], j, stones);
// j+1
if(m.find(stones[i]+j+1) != m.end())
t3 = canCrossHelper(m, dp, m[stones[i]+j+1], j+1, stones);
dp[i][j] = t1 || t2 || t3;
return dp[i][j];
}
bool canCross(vector<int>& stones) {
if(stones[1] != 1)
return false;
int n = stones.size();
unordered_map<int, int> m;
vector<vector<int>> dp(n, vector<int>(n+1, -1));
// Populate the map
for(int i = 0; i < n; i++)
m[stones[i]] = i;
return canCrossHelper(m, dp, 1, 1, stones);
}
};