498. 对角线遍历
题目链接
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/diagonal-traverse
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目描述
给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。
示例:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,4,7,5,3,6,8,9]
解释:
说明:
- 给定矩阵中的元素总数不会超过 100000 。
题目分析
- 根据题目描述按照对角线遍历矩阵
- 按照模拟的思想,按照对角线遍历矩阵可分为两种方向。第一种方向,从左下角到右上角,即row--,col++;第二种方向,从右上角到左下角,即row++,col--。
- 当row和col超出矩阵范围时,更该行进方向,直到遍历完成整个矩阵
代码
class Solution {
public:
vector<int> findDiagonalOrder(vector<vector<int>>& mat) {
if (mat.size() == 1) return mat[0];
std::vector<int> res;
addElem(mat, res, true, 0, 0);
return res;
}
private:
void addElem(std::vector<vector<int>>& mat, std::vector<int>& res, const bool sth, int row, int col) {
if (sth) {
while (row >= 0 && row < mat.size() && col >= 0 && col < mat[0].size()) {
res.emplace_back(mat[row][col]);
--row;
++col;
}
if (row + 1 >= 0 && row + 1 < mat.size() && col >= 0 && col < mat[0].size()) {
addElem(mat, res, !sth, row + 1, col);
} else if (row + 2 >= 0 && row + 2 < mat.size() && col - 1 >= 0 && col - 1 < mat[0].size()) {
addElem(mat, res, !sth, row + 2, col - 1);
}
}
else {
while (row >= 0 && row < mat.size() && col >= 0 && col < mat[0].size()) {
res.emplace_back(mat[row][col]);
++row;
--col;
}
if (row >= 0 && row < mat.size() && col + 1 >= 0 && col + 1 < mat[0].size()) {
addElem(mat, res, !sth, row, col + 1);
} else if (row - 1 >= 0 && row - 1 < mat.size() && col + 2 >= 0 && col + 2 < mat[0].size()) {
addElem(mat, res, !sth, row - 1, col + 2);
}
}
}
};