LeetCode 498
https://leetcode.cn/problems/diagonal-traverse/description/
难度:中等
高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/
模拟对角线遍历,当到达边界的时候需要改变方向。需要注意的是在判断边界时有顺序要求,例如向上移动时,需要先处理右边界,再处理上边界。这是因为如果当同时到达右边界和上边界时,如果处理上边界,col 就越界了。
时间复杂度:O(m×n),其中 m 为矩阵行的数量,n 为矩阵列的数量。需要遍历一遍矩阵中的所有元素,需要的时间复杂度为 O(m×n)。
空间复杂度:O(1)。除返回值外不需要额外的空间。
class Solution {
public:
vector<int> findDiagonalOrder(vector<vector<int>>& mat) {
int m = mat.size(), n = mat[0].size();
vector<int> ans;
int row = 0, col = 0;
bool up = true; // 方向标志:true表示向上移动,false表示向下移动
while (ans.size() < m * n) {
ans.push_back(mat[row][col]);
if (up) { // 向上移动(右上方向)
if (col == n - 1) { // 到达右边界
row++;
up = false; // 改为向下
} else if (row == 0) { // 到达上边界
col++;
up = false; // 改为向下
} else { // 正常向上移动
row--;
col++;
}
} else { // 向下移动(左下方向)
if (row == m - 1) { // 到达下边界
col++;
up = true; // 改为向上
} else if (col == 0) { // 到达左边界
row++;
up = true; // 改为向上
} else { // 正常向下移动
row++;
col--;
}
}
}
return ans;
}
};