刷题-力扣-498. 对角线遍历

498. 对角线遍历

题目链接

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

题目描述

给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。

示例:

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

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

解释:

说明:

  • 给定矩阵中的元素总数不会超过 100000 。

题目分析

  1. 根据题目描述按照对角线遍历矩阵
  2. 按照模拟的思想,按照对角线遍历矩阵可分为两种方向。第一种方向,从左下角到右上角,即row--,col++;第二种方向,从右上角到左下角,即row++,col--。
  3. 当row和col超出矩阵范围时,更该行进方向,直到遍历完成整个矩阵

代码

class Solution {
public:
    vector<int> findDiagonalOrder(vector<vector<int>>& mat) {
        if (mat.size() == 1) return mat[0];
        std::vector<int> res;
        addElem(mat, res, true, 0, 0);
        return res;
    }

private:
    void addElem(std::vector<vector<int>>& mat, std::vector<int>& res, const bool sth, int row, int col) {
        if (sth) {
            while (row >= 0 && row < mat.size() && col >= 0 && col < mat[0].size()) {
                res.emplace_back(mat[row][col]);
                --row;
                ++col;
            }
            if (row + 1 >= 0 && row + 1 < mat.size() && col >= 0 && col < mat[0].size()) {
                addElem(mat, res, !sth, row + 1, col);
            } else if (row + 2 >= 0 && row + 2 < mat.size() && col - 1 >= 0 && col - 1 < mat[0].size()) {
                addElem(mat, res, !sth, row + 2, col - 1);
            }
        }
        else {
            while (row >= 0 && row < mat.size() && col >= 0 && col < mat[0].size()) {
                res.emplace_back(mat[row][col]);
                ++row;
                --col;
            }
            if (row >= 0 && row < mat.size() && col + 1 >= 0 && col + 1 < mat[0].size()) {
                addElem(mat, res, !sth, row, col + 1);
            } else if (row - 1 >= 0 && row - 1 < mat.size() && col + 2 >= 0 && col + 2 < mat[0].size()) {
                addElem(mat, res, !sth, row - 1, col + 2);
            }
        }
    }
};
原文地址:https://www.cnblogs.com/HanYG/p/15251047.html