class Solution {
public int[] findDiagonalOrder(int[][] matrix) {
if (matrix == null || matrix.length == 0) return new int[0];
int M = matrix.length;
int N = matrix[0].length;
int[] result = new int[M * N];
int row = 0, col = 0, d = 0;
int[][] DIRECT = {{-1, 1}, {1, -1}};
for (int i = 0; i < M*N; i++) {
result[i] = matrix[row][col];
row += DIRECT[d][0];
col += DIRECT[d][1];
if (col >= N) {
col = N - 1;
row += 2;
d = 1 - d;
}
if (row >= M) {
row = M - 1;
col += 2;
d = 1 - d;
}
if (row < 0) {
row = 0;
d = 1 -d;
}
if (col < 0) {
col = 0;
d = 1 - d;
}
}
return result;
}
}
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> result = new ArrayList();
if (matrix == null || matrix.length == 0) return result;
int M = matrix.length;
int N = matrix[0].length;
int rowStart = 0, rowEnd = M - 1, colStart = 0, colEnd = N -1;
while (rowStart <= rowEnd && colStart <= colEnd) {
for (int i = colStart; i <= colEnd; i++) {
result.add(matrix[rowStart][i]);
}
rowStart++;
for (int i = rowStart; i <= rowEnd; i++) {
result.add(matrix[i][colEnd]);
}
colEnd--;
if (rowStart <= rowEnd) {
for (int i = colEnd; i >= colStart; i--) {
result.add(matrix[rowEnd][i]);
}
}
rowEnd--;
if (colStart <= colEnd) {
for (int i = rowEnd; i >= rowStart; i--) {
result.add(matrix[i][colStart]);
}
}
colStart++;
}
return result;
}
}