LeetCode 498 - 对角线遍历

104 阅读2分钟

给你一个大小为 m x n 的矩阵 mat ,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。

 

示例 1:

1661591414693.jpg

输入: mat = [[1,2,3],[4,5,6],[7,8,9]]
输出: [1,2,4,7,5,3,6,8,9]

示例 2:

输入:mat = [[1,2],[3,4]] 输出:[1,2,3,4]  

提示:

  • m == mat.length
  • n == mat[i].length
  • 1 <= m, n <= 104
  • 1 <= m * n <= 104
  • -105 <= mat[i][j] <= 105

思路 : 直接模拟

  • 计算数组的大小即遍历次数 all ,初始化 坐标 x = 0,y = 0;
  • 判断 (x+y)的奇偶性:
    • 如果 (x+y)%2==0 ,右上遍历:
      • 如果是最后一列,不能再修改列数 y,会越界;
      • 如果是第一行,向右即可;
      • 否则正常右上;
    • 如果 ((x+y)%2!=0 ,左下遍历:
      • 如果是最后一行,不能再修改行数 x,会越界;
      • 如果是第一列,向下即可;
      • 否则正常左下;
  • 返回结果。

具体代码

class Solution {
    public int[] findDiagonalOrder(int[][] mat) {
        int m = mat.length;
        int n = mat[0].length;
        int all = m * n;
        int[] res = new int[all];

        int x= 0,y = 0;
        for (int i = 0; i < all; i++) {
            res[i] = mat[x][y];
            if ((x+y)%2 == 0) {
                if (y == n - 1){ 
                    x++; // 如果是最后一列,不能再修改列数y了,会越界
                }else if (x == 0) {
                    y++; // 如果是第一行,向右即可;
                }else {
                    x--; y++; // 正常右上
                }
            }else{
                if (x == m - 1){
                     y++; //如果是最后一行,不能再修改行数x了,会越界
                }else if (y == 0){
                     x++; //如果是第一列,向下即可;
                }else {
                    x++; y--; //正常左下
                }
            }
        }
        return res;
    }
}

复杂度分析

时间复杂度:O(m×n),其中 m 为矩阵行的数量,n 为矩阵列的数量。需要遍历一遍矩阵中的所有元素,需要的时间复杂度为 O(m×n)。

空间复杂度:O(1)。除返回值外不需要额外的空间。