498. 对角线遍历

2022-06-14  本文已影响0人  刘翊扬

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

示例 1:


image.png
输入: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]

提示:

image.png

观察上面图:

注意临界点,超过边界的处理

public int[] findDiagonalOrder(int[][] mat) {
        int row = mat.length, col = mat[0].length;
        int[] res = new int[row * col];
        int r = 0, c = 0;
        for (int i = 0; i < res.length; i++) {
            res[i] = mat[r][c];
            if ((r + c) % 2 == 0) {
                // 偶数,是向上的
                if (c == col - 1) {
                    // 下一步是向下移动,此时右移 r++
                    r++;
                } else if (r == 0) {
                    // 下一步向上移动
                    c++;
                } else {
                    r--;
                    c++;
                }
            } else {
                // 奇数,向下
                if (r == row - 1) {
                    // 下一步是向上移动,此时右移 row++
                    c++;
                } else if (c == 0) {
                    // 下一步向上移动
                    r++;
                } else {
                    r++;
                    c--;
                }
            }
        }
        return res;
    }

方法二:官方答案


image.png
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;
    }
}

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/diagonal-traverse
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

上一篇 下一篇

猜你喜欢

热点阅读