https://leetcode.com/problems/sort-the-matrix-diagonally/

1. Use STL sort():

  1. //20 ms 9.5 MB
  2. class Solution {
  3. public:
  4. vector<vector<int>> diagonalSort(vector<vector<int>>& mat) {
  5. //top-right [0][n-1]
  6. //buttom-left [m-1][0]
  7. //m = 3, n = 4
  8. //[0][n-1]
  9. //[0][n-2] [1][n-1] i = 1
  10. //[0][n-3] [1][n-2] [2][n-1] i = 2
  11. //[0][0] [1][n-3] [2][n-2] i = 3
  12. //[1][0] [2][1] i = 4
  13. //[2][0] i = 5
  14. //i = total of difference
  15. //v = vertical difference
  16. //h = horizontal difference
  17. //v + h == i
  18. int m = mat.size();
  19. int n = mat[0].size();
  20. for(int i=0; i<m+n-1; i++){
  21. Find_And_Fill_Diagonals(i, mat, m, n);
  22. }
  23. return mat;
  24. }
  25. private:
  26. void Find_And_Fill_Diagonals(int diff, vector<vector<int>>& mat, int m, int n){
  27. vector<int> diagonal;
  28. int v_init;
  29. int h_init;
  30. if(diff<=n-1){
  31. v_init = 0;
  32. h_init = n-1-diff;
  33. } else{
  34. v_init = diff-n+1;
  35. h_init = 0;
  36. }
  37. int v_curr = v_init;
  38. int h_curr = h_init;
  39. while(v_curr<m && h_curr<n){
  40. diagonal.push_back(mat[v_curr][h_curr]);
  41. v_curr++;
  42. h_curr++;
  43. }
  44. sort(diagonal.begin(), diagonal.end());
  45. v_curr = v_init;
  46. h_curr = h_init;
  47. for(int i=0; i<diagonal.size(); i++){
  48. mat[v_curr][h_curr] = diagonal[i];
  49. v_curr++;
  50. h_curr++;
  51. }
  52. }
  53. };

Time Complexity: O(m*n)
Space Complexity: O(sqrt(m^2 + n^2))