题目:498.对角线遍历
给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。
示例1:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,4,7,5,3,6,8,9]
解释:
解题思路
- 使用一个外层循环遍历所有的对角线。第一行和最后一列的元素都是对角线的起点。 使用一个内层 while
- 循环遍历对角线上的所有元素。可以计算指定对角线上的元素数量,也可以简单迭代直到索引超出范围。
- 对于奇数编号的对角线,只需要将迭代结果翻转再加入结果数组即可。
代码
class Solution {
public:
vector<int> findDiagonalOrder(vector<vector<int>>& matrix) {
if (matrix.size() == 0)
return {};
//数组的行,列长度
int m = matrix.size();
int n = matrix[0].size();
//对角线条数(从0开始)
int dia_line=m+n-1;
//存放结果
vector <int> result;
//遍历对角线
for (int i = 0 ; i <dia_line ;++i){
//对角线头,尾
int dia_begin = i + 1 <= n ? 0 : i + 1 - n;
int dia_end = i + 1 >= m ? m - 1 : i;
//判断对角线的奇偶,偶数顺序排入,奇数逆序排入。
if (i % 2 == 1){
for (int j = dia_begin ; j <= dia_end ; ++j)
result.push_back(matrix[j][i - j]);
}
else{
for (int j = dia_end ; j >= dia_begin ; --j)
result.push_back(matrix[j][i - j]);
}
}
return result;
}
};