Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class Solution {
- public:
- int longestIncreasingPath(vector<vector<int>>& matrix) {
- int m = matrix.size(), n = m? matrix[0].size(): 0;
- vector<vector<int>> padding(m + 2, vector<int>(n + 2, INT_MIN));
- vector<pair<int, int>> dirs = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
- for(int i = 0; i < m; ++i)
- for(int j = 0; j < n; ++j)
- padding[i + 1][j + 1] = matrix[i][j];
- vector<vector<int>> outdegrees(m + 2, vector<int>(n + 2, 0));
- for(int i = 1; i <= m; ++i)
- {
- for(int j = 1; j <= n; ++j)
- {
- for(auto& dir: dirs)
- {
- if(padding[i][j] < padding[i + dir.first][j + dir.second])
- ++outdegrees[i][j];
- }
- }
- }
- //get leaves
- queue<int> leaves;
- for(int i = 1; i <= m; ++i)
- for(int j = 1; j <= n; ++j)
- if(!outdegrees[i][j])
- leaves.push(i * (n + 2) + j);
- //peeling onion
- int len = 0;
- while(leaves.size())
- {
- ++len;
- int size = leaves.size();
- while(size-- > 0)
- {
- int leave = leaves.front();
- leaves.pop();
- int i = leave / (n + 2), j = leave % (n + 2);
- for(auto& dir: dirs)
- {
- if(padding[i][j] > padding[i + dir.first][j + dir.second])
- if(--outdegrees[i + dir.first][j + dir.second] == 0)
- leaves.push((i + dir.first) * (n + 2) + j + dir.second);
- }
- }
- }
- return len;
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement