首先看上图可以得出它的遍历顺序,第一趟往右上方向,第二趟往左下方向,第三趟又和第一趟的遍历方向一样为右上,第四趟方向又和第二趟一样为左下方向.........规律以此类推。
思路理清楚了 下面开始代码填充:
class Solution {
public:
vector<int> findDiagonalOrder(vector<vector<int>>& mat)
{
vector<int> vec; //将m*n矩阵中的数组重新排列之后存储在vec中进行返回
int size = mat.size() * mat[0].size(); //m*n矩阵大小为长乘宽
int x = 0, y = 0; //初始化坐标下标为0,0
for (int i = 0; i < size; ++i)
{
vec.push_back(mat[x][y]);
//右上方向遍历
if ((x + y) % 2 == 0)
{
if (y == mat[0].size() - 1) //到达了右边界(最后一列) 不进行y++了 因为这样会越界
{
x++;
}
else if (x == 0) //当前遍历元素处于第一行
{
y++;
}
else
{
x--;
y++;
}
}
//左下方向遍历
else
{
if (x == mat.size() - 1) //到达了右边界(最后一行) 不进行x++了 因为这样会越界
{
y++;
}
else if (y == 0) 当前遍历元素处于第一列
{
x++;
}
else
{
x++;
y--;
}
}
}
return vec;
}
}
总结:在这道题中我们根据对角线遍历的规则,可以按照其二维坐标的变化来分别列出右上遍历和左下遍历的规律 ,再将每次遍历的都存入vector中,最后return返回这个vector就好。