498. 对角线遍历

166 阅读1分钟

题目描述

思路

  • 确定好坐标系后,
    • 往右上扫:i + 1, j - 1
    • 往左下扫:i - 1, j + 1
  • 几个易错点:
    • 坐标系的初始化

    • ij坐标在取matrix[]元素时的写法

    • 扫描次数 = ?

    • 怎么解决方向?

    • 边界情况有几种?

602B86AB4C2FEB31B8EC4A3F0FADCF10.png

代码

class Solution {
    public int[] findDiagonalOrder(int[][] matrix) {
        if (matrix.length == 0) return new int[0];
        int m = matrix[0].length;
        int n = matrix.length;
        int k = m + n - 1;//穿插次数
        int[] res = new int[m * n];
        int i = 0, j = 0;//坐标系初始化成:要以左上角为零点,i是纵轴,j是横轴
        int count = 0;//结果集指针
        for (int times = 0; times < k; times++) {
            //向右上扫
            if (times % 2 == 0) {
                while(i >= 0 && j < m) {
                    res[count] = matrix[i][j];
                    count++;
                    i--;
                    j++;
                }
                if (j < m) {//把坐标放到下一次扫(向左下扫)的起点,红色情况1
                    i++;
                } else {//把坐标放到下一次扫(向左下扫)的起点,红色情况2
                    i += 2;
                    j--;
                    
                }
            } else {
                //向左下扫
                while (i < n && j >= 0) {
                    res[count] = matrix[i][j];
                    count++;
                    i++;
                    j--;
                }
                if (i < n) {//把坐标放到下一次扫(向右上扫)的起点,蓝色情况1
                    j++;
                } else {//把坐标放到下一次扫(向右上扫)的起点, 蓝色情况2
                    i--;
                    j += 2;
                }
            }
        }
        return res;
    }
}