给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。
示例:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,4,7,5,3,6,8,9]
方法一:
每层的索引和相等:
- 假设矩阵无限大;
- 索引和为{偶}数,向上遍历,{横}索引值递减,遍历值依次是(x,0),(x-1,1),(x-2,2),…,(0,x)
- 索引和为{奇}数,向下遍历,{纵}索引值递减,遍历值依次是(0,y),(1,y-1),(2,y-2),…,(y,0)每层的索引和:
0: (00)
1: (01)(10)
2: (20)(11)(02)
3: (03)(12)(21)(30)
4: (40)(31)(22)(13)(04)
5: (05)(14)(23)(32)(41)(50)
6: (60)(51)…(06)
按照“层次”遍历
代码如下:
class Solution {
public:
vector<int> findDiagonalOrder(vector<vector<int>>& matrix) {
vector<int>result;
int hang=matrix.size();
if (hang==0)return result;
int lie=matrix[0].size();
int cengshu=hang+lie;
for(int x=0;x<cengshu;x++){
if(x%2==0)
{
for(int i=x;i>=0;i--)
{
int j=x-i;
if((i<hang)&&(j<lie))
{
result.push_back(matrix[i][j]);
}
}
}
else
{
for(int j=x;j>=0;j--)
{
int i=x-j;
if((j<lie)&&(i<hang))
{
result.push_back(matrix[i][j]);
}
}
}
}
return result;
}
};
方法二:
直接遍历时按照 “右上” 和 “左下” 移动。
class Solution {
public:
vector<int> findDiagonalOrder(vector<vector<int>>& matrix) {
if(matrix.empty()||matrix[0].empty())return {};
int m=matrix.size(),n=matrix[0].size();//m行,n列
vector<int> result(m*n);
vector<vector<int>> move{{-1,1},{1,-1}};//右上和左下移动
int row=0,col=0,k=0;
for(int i=0;i<m*n;i++){
result[i]=matrix[row][col];
row=row+move[k][0];
col=col+move[k][1];
if(row>=m){//碰到下边界
row=m-1;
col=col+2;
k=1-k;
}
if(col>=n){//碰到右边界
col=n-1;
row=row+2;
k=1-k;
}
if(row<0){//碰到上边界
row=0;
k=1-k;
}
if(col<0){//碰到左边界
col=0;
k=1-k;
}
}
return result;
}
};