498. Diagonal Traverse

1. Description

Given an m x n matrix mat, return an array of all the elements of the array in a diagonal order.

2. Example

Example 1

Example 1
Input: mat = [[1,2,3],[4,5,6],[7,8,9]]
Output: [1,2,4,7,5,3,6,8,9]

Example 2

Input: mat = [[1,2],[3,4]]
Output: [1,2,3,4]

3. Constraints

  • m == mat.length
  • n == mat[i].length
  • 1 <= m, n <= 10$^4$
  • 1 <= m * n <= 10$^4$
  • -10$^5$ <= mat[i][j] <= 10$^5$

4. Solutions

Simulation

m = matrix.size(), n = matrix.front().size()
Time complexity: O(mn)
Space complexity: O(1)

class Solution {
public:
    vector<int> findDiagonalOrder(const vector<vector<int>> &matrix) {
        const int m = matrix.size(), n = matrix.front().size();
        vector<int> values;
        values.reserve(m * n);

        int row = 0, column = 0, dir = 0;
        array<array<int, 2>, 2> directions{{{-1, 1}, {1, -1}}};

        for (int i = 0; i < m * n; ++i) {
            values.push_back(matrix[row][column]);

            row += directions[dir][0];
            column += directions[dir][1];

            if (dir == 0 && (row < 0 || column >= n)) {
                dir = 1;
                if (column >= n) {
                    row += 2;
                    column = n - 1;
                } else {
                    row = 0;
                }
            } else if (dir == 1 && (column < 0 || row >= m)) {
                dir = 0;
                if (row >= m) {
                    row = m - 1;
                    column += 2;
                } else {
                    column = 0;
                }
            }
        }

        return values;
    }
};
comments powered by Disqus