LeetCode498. 对角线遍历

LeetCode498. 对角线遍历

题目说明

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

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

题目分析

参考大部分博客,因为涉及到改变方向,所以这里主要是定义一个二维矩阵dirs{{-1,1}, {1,-1}}
[ -1, 1],
[ 1, -1]
第一列表示它向右上角走,第二列表示向左下角走。

如 行row+dirs[0][0]表示向上,此时列col加上1,表示向右上。当我们想要改变方向时,只需要用 【1 - 第一列的值】

然后主要就是判断改变方向的情况,这里需要分两种,一种是遇到右上角和左下角继续走得情况,这时候需要改变两个坐标值,而奇数列的矩阵,一般都是右上角往右上角走;而偶数列的矩阵是左下角往左下角走。比如我们已经从右上角走到了右上角没有元素的地方,那么只需要在这个位置,**【行+2;列-1;改变行走方向】**就可以了。

另一种情况就是一般的边界地方越界,且不是角点的位置,那么只需要改变一个坐标,然后再改变行走方向。

参考代码

class Solution {
public:
    vector<int> findDiagonalOrder(vector<vector<int>>& matrix) {
        
        if( matrix.empty() || matrix[0].empty() ) return {}; //注意这里返回的值,用大括号表示空的二维数组
        int m = matrix.size(); //行
        int n = matrix[0].size(); //列
        int row = 0, col = 0, k = 0;
        vector<vector<int>> dirs = {{-1,1},{1,-1}};  //2x2的矩阵
        vector<int> res(m*n);
        for(int i = 0;i < m*n; ++i)
        {
            res[i] = matrix[row][col]; //返回当前元素
            // 计算下一个点的位置
            row += dirs[k][0]; //行往上走,需要减一
            col += dirs[k][1]; //列往右走,需要加一
            // 判断下一个点位置的各种情况
            
            // 左下角和右下角需要改变两个位置的坐标=
            if(col > n-1)  //右上角的元素还往右上角走,一般是奇数列
            {
                cout<<"test"<<endl;
                col = col-1;
                row += 2;
                k = 1-k;  //改变行走方向,往左下走
            }
            if(row > m-1)  // 左下元素继续往左下走,一般是偶数列
            {
                cout<<"test"<<endl;
                row = row-1;
                col += 2;
                k = 1-k;
            }
            // 非角点处只需要改变一个坐标
            if(col < 0)
            {
                cout<<"test"<<endl;
                col = col+1;
                k = 1-k; //改变行走方向,往右上走
            }
            if(row < 0)
            {
                cout<<"test"<<endl;
                row = row+1;
                k = 1-k;
            }
        }
        return res;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值