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;
}
};