【LeetCode刷题】498.对角线遍历

题目:498.对角线遍历

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

示例1:

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

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

解释:
在这里插入图片描述

解题思路

  • 使用一个外层循环遍历所有的对角线。第一行和最后一列的元素都是对角线的起点。 使用一个内层 while
  • 循环遍历对角线上的所有元素。可以计算指定对角线上的元素数量,也可以简单迭代直到索引超出范围。
  • 对于奇数编号的对角线,只需要将迭代结果翻转再加入结果数组即可。

代码

class Solution {
public:
    vector<int> findDiagonalOrder(vector<vector<int>>& matrix) {
        if (matrix.size() == 0)
            return {};
        //数组的行,列长度
        int m = matrix.size();
        int n = matrix[0].size();
        //对角线条数(从0开始)
        int dia_line=m+n-1;
        //存放结果
        vector <int> result;
        //遍历对角线
        for (int i = 0 ; i <dia_line ;++i){
             //对角线头,尾
            int dia_begin = i + 1 <= n ? 0 : i + 1 - n;
            int dia_end =  i + 1 >= m ? m - 1 : i;
             //判断对角线的奇偶,偶数顺序排入,奇数逆序排入。
            if (i % 2 == 1){
                for (int j = dia_begin ; j <= dia_end ; ++j)
                    result.push_back(matrix[j][i - j]);
            }
            else{
                for (int j = dia_end ; j >= dia_begin ; --j)
                    result.push_back(matrix[j][i - j]);
            }
        }
        return result;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值