-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy path329. Longest Increasing Path in a Matrix.cpp
147 lines (88 loc) · 3.12 KB
/
329. Longest Increasing Path in a Matrix.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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
Hard
5889
95
Add to List
Share
Given an m x n integers matrix, return the length of the longest increasing path in matrix.
From each cell, you can either move in four directions: left, right, up, or down.
You may not move diagonally or move outside the boundary (i.e., wrap-around is not allowed).
Example 1:
Input: matrix = [[9,9,4],[6,6,8],[2,1,1]]
Output: 4
Explanation: The longest increasing path is [1, 2, 6, 9].
Example 2:
Input: matrix = [[3,4,5],[3,2,6],[2,2,1]]
Output: 4
Explanation: The longest increasing path is [3, 4, 5, 6]. Moving diagonally is not allowed.
Example 3:
Input: matrix = [[1]]
Output: 1
Constraints:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 200
0 <= matrix[i][j] <= 2^31 - 1
// Approach 1: Recursion (TLE)
// TC -> O((N*M)*4^(N*M))
// SC -> O(N*M)
class Solution {
public:
vector <pair<int, int>> directions = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
int longestIncPath = 1;
bool isValid(int i, int j, vector<vector<int>>& matrix) {
return (i >= 0 && i < matrix.size() && j >= 0 && j < matrix[0].size());
}
int solve(int i, int j, vector<vector<int>>& matrix) {
int path = 1;
for (auto direction: directions) {
int x = i + direction.first;
int y = j + direction.second;
if (isValid(x, y, matrix) && matrix[x][y] > matrix[i][j])
path = max(path, 1 + solve(x, y, matrix));
}
return path;
}
int longestIncreasingPath(vector<vector<int>>& matrix) {
int m = matrix.size(), n = matrix[0].size();
dp.resize(m, vector<int> (n, -1));
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
longestIncPath = max(longestIncPath, solve(i, j, matrix));
}
}
return longestIncPath;
}
};
// Approach 2: memoization (Accepted)
// TC -> O(NM)
// SC -> O(NM)
class Solution {
public:
vector <pair<int, int>> directions = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
int longestIncPath = 1;
vector<vector<int>> dp;
bool isValid(int i, int j, vector<vector<int>>& matrix) {
return (i >= 0 && i < matrix.size() && j >= 0 && j < matrix[0].size());
}
int solve(int i, int j, vector<vector<int>>& matrix) {
if (dp[i][j] != -1) return dp[i][j];
dp[i][j] = 1;
for (auto direction: directions) {
int x = i + direction.first;
int y = j + direction.second;
if (isValid(x, y, matrix) && matrix[x][y] > matrix[i][j])
dp[i][j] = max(dp[i][j], 1 + solve(x, y, matrix));
}
return dp[i][j];
}
int longestIncreasingPath(vector<vector<int>>& matrix) {
int m = matrix.size(), n = matrix[0].size();
dp.resize(m, vector<int> (n, -1));
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
longestIncPath = max(longestIncPath, solve(i, j, matrix));
}
}
return longestIncPath;
}
};