给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。
示例:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,4,7,5,3,6,8,9]
解释:
说明:
给定矩阵中的元素总数不会超过 100000 。
思路分析: 不难发现每次都在重复一个过程——斜向右上扫描,斜向左下扫描。
class Solution {
public:
vector<int> findDiagonalOrder(vector<vector<int>>& matrix) {
vector<int> resultVec;
int rowSize = matrix.size();
if (rowSize == 0){
return resultVec;
}
int colSize = matrix[0].size();
int cnt = rowSize * colSize, row = 0, col = 0;//cnt是任然需要扫描的个数,row,col为即将扫描的坐标
while (cnt > 0) {
//斜向右上扫描
resultVec.push_back(matrix[row][col]);
cnt -= 1;
while (row - 1 >= 0 && col + 1 < colSize) {
row -= 1;
col += 1;
resultVec.push_back(matrix[row][col]);
cnt -= 1;
}
//转向
if (row == 0 && col != colSize - 1) {
//右上遇到上边界(除右上顶点之外)
col += 1;
}
else if (col == colSize - 1) {
//右上遇到右边界
row += 1;
}
if (cnt > 0) {
//斜向左下扫描
resultVec.push_back(matrix[row][col]);
cnt -= 1;
while (row + 1 < rowSize && col - 1 >= 0) {
row += 1;
col -= 1;
resultVec.push_back(matrix[row][col]);
cnt -= 1;
}
//转向
if (col == 0 && row != rowSize - 1) {
//左下遇到左边界(除左下顶点之外)
row += 1;
}
else if (row == rowSize - 1) {
//左下遇到下边界
col += 1;
}
}
}
return resultVec;
}
};