Advertisement
Guest User

Untitled

a guest
Aug 20th, 2017
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.70 KB | None | 0 0
  1. class Solution {
  2. public:
  3. int longestIncreasingPath(vector<vector<int>>& matrix) {
  4. int m = matrix.size(), n = m? matrix[0].size(): 0;
  5. vector<vector<int>> padding(m + 2, vector<int>(n + 2, INT_MIN));
  6. vector<pair<int, int>> dirs = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
  7. for(int i = 0; i < m; ++i)
  8. for(int j = 0; j < n; ++j)
  9. padding[i + 1][j + 1] = matrix[i][j];
  10. vector<vector<int>> outdegrees(m + 2, vector<int>(n + 2, 0));
  11. for(int i = 1; i <= m; ++i)
  12. {
  13. for(int j = 1; j <= n; ++j)
  14. {
  15. for(auto& dir: dirs)
  16. {
  17. if(padding[i][j] < padding[i + dir.first][j + dir.second])
  18. ++outdegrees[i][j];
  19. }
  20.  
  21. }
  22. }
  23.  
  24. //get leaves
  25. queue<int> leaves;
  26. for(int i = 1; i <= m; ++i)
  27. for(int j = 1; j <= n; ++j)
  28. if(!outdegrees[i][j])
  29. leaves.push(i * (n + 2) + j);
  30.  
  31. //peeling onion
  32. int len = 0;
  33. while(leaves.size())
  34. {
  35. ++len;
  36. int size = leaves.size();
  37. while(size-- > 0)
  38. {
  39. int leave = leaves.front();
  40. leaves.pop();
  41. int i = leave / (n + 2), j = leave % (n + 2);
  42. for(auto& dir: dirs)
  43. {
  44. if(padding[i][j] > padding[i + dir.first][j + dir.second])
  45. if(--outdegrees[i + dir.first][j + dir.second] == 0)
  46. leaves.push((i + dir.first) * (n + 2) + j + dir.second);
  47. }
  48. }
  49. }
  50. return len;
  51. }
  52. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement