一、题目
给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。
二、基本思路理解
1、先写出遍历时,索引位置序号,观察规律再看
1 | 2 | 3 |
---|---|---|
[0][0] | [0][1] | [0][2] |
4 | 5 | 6 |
[1][0] | [1][1] | [1][2] |
7 | 8 | 9 |
[2][0] | [2][1] | [2][2] |
对角遍历过程为
1 | 2 | 4 |
---|---|---|
[0][0] | [0][1] | [1][0] |
7 | 5 | 3 |
[2][0] | [1][1] | [0][2] |
6 | 8 | 9 |
[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;
}
};
自己的代码就是无法运行出结果!!!!
暂未找到原因!!!