对角线遍历(按照斜着的层次进行遍历)解法

题目:

给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。
示例:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,4,7,5,3,6,8,9]

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

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

分析思路:

根据题目的提示,甚至是题目的名字,我们不难发现本题希望我们能够对一个矩阵进行斜着遍历,
正常来讲,如果是一个方阵,如何进行对角线遍历呢?
问题一:一个N*N的方阵,斜着遍历需要几次?
问题二:第i次遍历时,如何实现像上图甩龙一样的遍历顺序:从左下->右上or右上->左下
问题三:如果不是方阵,上面两个问题的答案有什么变化?

当我们想出了这几个问题的答案,代码就不难编写了
一:N×N的需要遍历 N+ N -1次,M×N的需要 M + N -1次
二:根据i的奇偶关系,可以决定遍历的顺序

代码:

class Solution {
public:
    vector<int> findDiagonalOrder(vector<vector<int>>& matrix) {
        int M = matrix.size();      // 行
        vector<int> result;
        if(M == 0)
            return result;
        int N = matrix[0].size();   // 列
        int total = M * N;
        // vector<pair<int, int>> index;

         // 进行M+N-1次循环
        for(int i = 0;i < M+N-1;i++)
        {
            // 每一次循环push进去i个数据,代表横纵坐标
            int row = 0, column = 0; int n = i;
            
            if(n % 2 == 0){ // 如果i为偶数
                while(n+1){
                    row = n;
                    column = i - row;
                    if(row < M && column < N){
                        // index.push_back({row,column});
                        result.push_back(matrix[row][column]);
                    }
                    n--;
                }
            }
            else {  // 如果i为奇数
                while(n+1){
                    column = n;
                    row = i - column;
                    if(row < M && column < N){
                        // index.push_back({row,column});
                        result.push_back(matrix[row][column]);
                    }
                    n--;
                }
            } 
        }
        return result;
    }
};
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值