zoukankan      html  css  js  c++  java
  • 刷题-力扣-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);
                }
            }
        }
    };
    
  • 相关阅读:
    try....exception....finally
    Django的信号机制详解
    python 单例模式
    python raise assert
    python type metaclass
    python 类特殊成员
    python 道生一,一生二,二生三,三生万物
    C#DES加密
    C#AES加密
    C# MD5加密
  • 原文地址:https://www.cnblogs.com/HanYG/p/15251047.html
Copyright © 2011-2022 走看看