LT498. 对角线遍历

498. 对角线遍历

问题描述

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

示例 1:

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

输入: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

解题思路与代码实现

class Solution {

        /**
         * 解题思路:
         * 每条对角线的元素的行列下标之和是相等的:
         * 其为奇数时,向左下遍历;
         * 其为偶数时,向右上遍历
         * 需要注意在碰到行列边界时,需要相应右移或者下移
         */
        public int[] findDiagonalOrder(int[][] mat) {
            int m = mat.length, n = mat[0].length;
            int[] res = new int[m * n];
            int row = 0, col = 0;
            // 一共要访问m*n个元素
            for (int i = 0; i < res.length; i++) {
                res[i] = mat[row][col];
                // 偶数向右上方继续寻找,碰到边界需要调整
                if ((row + col) % 2 == 0) {
                    if (col == n - 1) {  // 下移
                        row++;
                    } else if (row == 0) { // 右移
                        col++;
                    } else {    // 右上
                        row--;
                        col++;
                    }
                } else {
                    if (row == m - 1) { // 右移
                        col++;
                    } else if (col == 0) {  // 下移
                        row++;
                    } else {    // 左下
                        row++;
                        col--;
                    }
                }
            }
            return res;
        }

    }

你可能感兴趣的:(leetcode)