**Input:** mat = [[1,2,3],[4,5,6],[7,8,9]]
**Output:** [1,2,4,7,5,3,6,8,9]
**Input:** mat = [[1,2],[3,4]]
**Output:** [1,2,3,4]
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;
}
}