NO.498 对角线遍历

题目

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

NO.498 对角线遍历_第1张图片

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

思路

一共有  m+n−1 条对角线,相邻的对角线的遍历方向不同,当前遍历方向为从左下到右上,则紧挨着的下一条对角线遍历方向为从右上到左下;

1. 设对角线从上到下的编号为 i , 对应取值范围是 [ 0 , m+n−2 ]

        当 i 为偶数时,则第 iii 条对角线的走向是从下往上遍历;        
        当  i 为奇数时,则第 iii 条对角线的走向是从上往下遍历;

2. 当第 i 条对角线从下往上遍历时,每次行索引减 1,列索引加 1,直到矩阵的边缘为止:

i < m  时,则此时对角线遍历的起点位置为 ( i , 0)
i ≥ m 时,则此时对角线遍历的起点位置为 ( m−1 , i−m+1 )

3.当第 i 条对角线从上往下遍历时,每次行索引加 1,列索引减 1,直到矩阵的边缘为止:

i < n 时,则此时对角线遍历的起点位置为 ( 0 , i  )
i ≥ n 时,则此时对角线遍历的起点位置为 ( i−n+1 , n−1 )

代码

class Solution {
    public int[] findDiagonalOrder(int[][] mat) {
        int m = mat.length;
        int n = mat[0].length;
        int[] res = new int[m * n];
        int pos = 0;
        for (int i = 0; i < m + n - 1; i++) {
            if (i % 2 == 1) {
                int x = i < n ? 0 : i - n + 1;
                int y = i < n ? i : n - 1;
                while (x < m && y >= 0) {
                    res[pos] = mat[x][y];
                    pos++;
                    x++;
                    y--;
                }
            } else {
                int x = i < m ? i : m - 1;
                int y = i < m ? 0 : i - m + 1;
                while (x >= 0 && y < n) {
                    res[pos] = mat[x][y];
                    pos++;
                    x--;
                    y++;
                }
            }
        }
        return res;
    }
}

你可能感兴趣的:(算法&数据结构,算法)