0498. Diagonal Traverse
https://leetcode.com/problems/diagonal-traverse
Description
Given an m x n matrix mat, return an array of all the elements of the array in a diagonal order.
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]Constraints:
m == mat.lengthn == mat[i].length1 <= m, n <= 1041 <= m * n <= 104-105 <= mat[i][j] <= 105
ac
class Solution {
    public int[] findDiagonalOrder(int[][] matrix) {
        // edge cases
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) return new int[0];
        int row = matrix.length;
        int col = matrix[0].length;
        int[] res = new int[row * col];
        int r = 0, c = 0;
        int index = 0;
        boolean up = true;
        while (r < row && c < col) {
            res[index++] = matrix[r][c];
            if (up) { // upward
                while (withinBoundary(r-1, c+1, matrix)) {
                    res[index++] = matrix[--r][++c];
                }
                if (withinBoundary(r, c+1, matrix)) c++;
                else if (withinBoundary(r+1, c, matrix)) r++;
                else break;
                up = !up;
            } else {  // downward
                while (withinBoundary(r+1, c-1, matrix)) {
                    res[index++] = matrix[++r][--c];
                }
                if (withinBoundary(r+1, c, matrix)) r++;
                else if (withinBoundary(r, c+1, matrix)) c++;
                else break;
                up = !up;
            }
        }
        // res[index] = matrix[row-1][col-1];  // add last one
        return res;
    }
    private boolean withinBoundary(int r, int c, int[][] matrix) {
        if (r < 0 || r >= matrix.length || c < 0 || c >= matrix[0].length)
            return false;
        return true;
    }
}Last updated
Was this helpful?