单向遍历
参考答案:https://leetcode.cn/problems/diagonal-traverse/solution/tong-su-yi-dong-by-lfool-eozv/ 题目不难理解,就是边界问题很难弄。这个方法应该是最好理解的了,就是可能性能不好…
int m, n;
ArrayList<Integer> arrayList = new ArrayList();
public int[] findDiagonalOrder(int[][] mat) {
m = mat.length;
n = mat[0].length;
boolean dir = true;//true表示要反转
//遍历第一行
for (int j = 0; j < n; j++) {
helper(mat, 0, j, dir);
dir = !dir;
}
//遍历最后一列
for (int i = 1; i < m; i++) {
helper(mat, i, n - 1, dir);
dir = !dir;
}
int[] ans = new int[m * n];
for (int i = 0; i < m * n; i++) {
ans[i] = arrayList.get(i);
}
return ans;
}
//沿着左下角的方向遍历
public void helper(int[][] mat, int x, int y, boolean dir) {
ArrayList<Integer> list = new ArrayList<>();
for (int i = x, j = y; i < m && j >= 0; i++, j--) {
list.add(mat[i][j]);
}
if (dir) {
Collections.reverse(list);
}
arrayList.addAll(list);
}