LeetCode 498. 对角线遍历(c++)

本文详细解析了如何使用C++解决LeetCode上的第498题,通过模拟对角线行走路径,探讨了如何根据对角线性质计算行数列数,以及如何根据对角线序号确定起终点坐标。算法思路清晰,适合理解对角线遍历问题的读者。
摘要由CSDN通过智能技术生成

LeetCode 498. 对角线遍历(c++)

图片来源
1.对角线性质

设矩阵行数为row,列数为column
在这里插入图片描述

	a.对角线总数为 row+column-1;
	b.同一条对角线上每个元素横纵坐标之和 x + y都相等,都等于对角线的序号。

**2.思路**		
  思路就是模拟图片中的行走路径。
  设对角线序号=i,对角线起始点坐标为x,y  对角线终点坐标为endx,endy  temp为元素个数-1
	  当i为偶数时
	  		i小于行数,即i<row
	  			x每次都等于对角线序号i,y=i-x;
	  		i>=row
	  			x等一最后一行函数,y=i-x;
	  		 (上面是求出了对角线起始点的坐标,下面求对角线终点坐标)
	  		当i<column
	  			endx始终等于0;
	  			temp=x-endx
	  		当i>=column
	  			endy=column-1
	  			temp=endy-y
	  从下往上走,x每次减,y每次加。
	  i为奇数是一样实在写不下去了,我写的太麻烦了,我就是把我这个很麻烦的思路记录下来
class Solution {
public:
    vector<int> findDiagonalOrder( vector<vector<int>>& mat ) {
        vector<int>v;
        int row = mat.size() ;
        int column = mat[0].size();
        int loop = row + column - 1;  //loop为对角线总数
        int x, y, endx, endy;	//x,y为对角线起始端点,endx,endy为对角线结束端点

        for( int i = 0; i < loop; i++ ) {
            int temp; //暂存 每个对角线元素个数-1

            if( i % 2 == 0 ) { //对角线序号为偶数
                if( i < row ) {  //求对角线起点位置
                    x = i;
                    y = i - x; //每个 对角线元素的 x与y和 都等于 对应的 对角线序号

                } else {
                    x = row - 1;
                    y = i - x;

                }

                if( i < column ) { //求 对角线终点位置 以及 对角线元素个数
                    endx = 0;
                    temp = x - endx;
                } else {
                    endy = column - 1;
                    temp = endy - y;
                }

                for( int j = 0; j <= temp; j++ ) {
                    v.push_back( mat[x--][y++] );
                }

            } else { //对角线序号为奇数
                if( i < column ) {
                    x = 0;
                    y = i - x;

                } else {
                    y = column - 1;
                    x = i - y;

                }

                if( i < row ) {
                    endx = i;
                    temp = endx - x;;
                } else {
                    endx = row - 1;
                    temp = endx - x;
                }

                for( int j = 0; j <= temp; j++ ) {
                    v.push_back( mat[x++][y--] );
                }

            }
        }

        return v;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值