单向遍历

参考答案:https://leetcode.cn/problems/diagonal-traverse/solution/tong-su-yi-dong-by-lfool-eozv/ 题目不难理解,就是边界问题很难弄。这个方法应该是最好理解的了,就是可能性能不好…

  1. int m, n;
  2. ArrayList<Integer> arrayList = new ArrayList();
  3. public int[] findDiagonalOrder(int[][] mat) {
  4. m = mat.length;
  5. n = mat[0].length;
  6. boolean dir = true;//true表示要反转
  7. //遍历第一行
  8. for (int j = 0; j < n; j++) {
  9. helper(mat, 0, j, dir);
  10. dir = !dir;
  11. }
  12. //遍历最后一列
  13. for (int i = 1; i < m; i++) {
  14. helper(mat, i, n - 1, dir);
  15. dir = !dir;
  16. }
  17. int[] ans = new int[m * n];
  18. for (int i = 0; i < m * n; i++) {
  19. ans[i] = arrayList.get(i);
  20. }
  21. return ans;
  22. }
  23. //沿着左下角的方向遍历
  24. public void helper(int[][] mat, int x, int y, boolean dir) {
  25. ArrayList<Integer> list = new ArrayList<>();
  26. for (int i = x, j = y; i < m && j >= 0; i++, j--) {
  27. list.add(mat[i][j]);
  28. }
  29. if (dir) {
  30. Collections.reverse(list);
  31. }
  32. arrayList.addAll(list);
  33. }