LeetCode 二维数组:498 对角线遍历

12 篇文章 1 订阅

一、题目

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

二、基本思路理解

1、先写出遍历时,索引位置序号,观察规律再看

123
[0][0][0][1][0][2]
456
[1][0][1][1][1][2]
789
[2][0][2][1][2][2]

对角遍历过程为

124
[0][0][0][1][1][0]
753
[2][0][1][1][0][2]
689
[1][2][2][1][2][2]

语言描述(3x3对角矩阵)
开始对角遍历时,第一个数是A[0][0],第二个数是A[0][1],下一个数是A[1][0];
紧接着,下一个位置处的数是A[2][0],第二个是是A[1][1],下一个数是A[0][2];
进一步,下一个位置处的数是A[1][2],第二个数是A[2][1],下一个数是A[2][2];

如果是(4x4对角矩阵)
开始对角遍历时,第一个数是A[0][0],第二个数是A[0][1],下一个数是A[1][0];
紧接着,下一位置处的数是A[2][0],第二个数是A[1][1],第三个数是A[0][2],下一个数是A[0][3];
进一步,下一个位置处的数是A[1][2],第二个数是A[2][1],第三个数是A[3][0],第四个数是A[3][1];
进一步,下一个位置处的数是A[2][2],第二个数是A[1][3],第三个数是A[2][3];
紧接着,下一个位置处的数是A[3][2],第二个数是A[3][3],

没有观察出来规律!!

2、借鉴别人的思路

(1)向上向下遍历的特点可以借鉴,对角线之和,是否为奇数还是偶数。观察发现,当对角线之和为偶数是向上遍历;对角线之和为奇数时,向下遍历。

3、再次思考

别人的代码

class Solution {
public:
    vector<int> findDiagonalOrder(vector<vector<int>>& matrix) {
        if(matrix.empty()) return {};
        vector<int>res;
        int m=matrix.size();
        int n=matrix[0].size();
        int i=0;
        while(i<m+n){
            //第1,3,5.....趟
            int x1=i<m?i:m-1;
            int y1=i-x1;
            while(x1>=0&&y1<n){
                res.push_back(matrix[x1][y1]);
                x1--;
                y1++;
            }
            i++;
            if(i>=m+n) break;
            //第2,4,6.....趟
            int y2=i<n?i:n-1;
            int x2=i-y2;
            while(x2<m&&y2>=0){
                res.push_back(matrix[x2][y2]);
                x2++;
                y2--;
            }
            i++;
        }
        return res;
    }
};

自己理解之后的代码

class Solution {
public:
    vector<int> findDiagonalOrder(vector<vector<int>>& matrix) {
        if(matrix.empty())  return {};  // 判断是否为空,若为空,返回空矩阵
		vector<int>  saveR;
        int row = matrix.size(); 
		int col = matrix[0].size();
        int i = 0;   
        while(i < row + col-1){
            // 遍历上行结构:一三五行
            int x1 = (i<row)? i:row-1;  // x1行数是递减趋势,y1列数是递增趋势
            int y1 = i - x1;
            if(x1>=0 && y1<col){
               saveR.push_back(matrix[x1][y1]); 
               x1--;
               y1++;
            }
            i++;
            if(i >= row+col-1)  break;  //遍历完上行结构转换到下行结构
            //遍历下行结构:二四行
            int y2 = (i<col)? i : col-1;  // x2行数是递增趋势,y2列数是递减趋势
            int x2 = i - y2;
            if(y2>=0 && x2<row){
                saveR.push_back(matrix[x2][y2]);
                y2--;
                x2++;
            }
            i++;
        }
        return saveR;
    }
};

自己的代码就是无法运行出结果!!!!
暂未找到原因!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Shae Zhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值