题目说明
给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。
示例
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,4,7,5,3,6,8,9]
题目分析
参考大部分博客,因为涉及到改变方向,所以这里主要是定义一个二维矩阵dirs{{-1,1}, {1,-1}},
[ -1, 1],
[ 1, -1]
用第一列表示它向右上角走,第二列表示向左下角走。
如 行row+dirs[0][0]表示向上,此时列col加上1,表示向右上。当我们想要改变方向时,只需要用 【1 - 第一列的值】
然后主要就是判断改变方向的情况,这里需要分两种,一种是遇到右上角和左下角继续走得情况,这时候需要改变两个坐标值,而奇数列的矩阵,一般都是右上角往右上角走;而偶数列的矩阵是左下角往左下角走。比如我们已经从右上角走到了右上角没有元素的地方,那么只需要在这个位置,**【行+2;列-1;改变行走方向】**就可以了。
另一种情况就是一般的边界地方越界,且不是角点的位置,那么只需要改变一个坐标,然后再改变行走方向。
参考代码
class Solution {
public:
vector<int> findDiagonalOrder(vector<vector<int>>& matrix) {
if( matrix.empty() || matrix[0].empty() ) return {}; //注意这里返回的值,用大括号表示空的二维数组
int m = matrix.size(); //行
int n = matrix[0].size(); //列
int row = 0, col = 0, k = 0;
vector<vector<int>> dirs = {{-1,1},{1,-1}}; //2x2的矩阵
vector<int> res(m*n);
for(int i = 0;i < m*n; ++i)
{
res[i] = matrix[row][col]; //返回当前元素
// 计算下一个点的位置
row += dirs[k][0]; //行往上走,需要减一
col += dirs[k][1]; //列往右走,需要加一
// 判断下一个点位置的各种情况
// 左下角和右下角需要改变两个位置的坐标=
if(col > n-1) //右上角的元素还往右上角走,一般是奇数列
{
cout<<"test"<<endl;
col = col-1;
row += 2;
k = 1-k; //改变行走方向,往左下走
}
if(row > m-1) // 左下元素继续往左下走,一般是偶数列
{
cout<<"test"<<endl;
row = row-1;
col += 2;
k = 1-k;
}
// 非角点处只需要改变一个坐标
if(col < 0)
{
cout<<"test"<<endl;
col = col+1;
k = 1-k; //改变行走方向,往右上走
}
if(row < 0)
{
cout<<"test"<<endl;
row = row+1;
k = 1-k;
}
}
return res;
}
};