LeetCode498.对角线遍历
Question
给你一个大小为
m x n
的矩阵mat
,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。
Example
Example 1:
输入:mat = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,4,7,5,3,6,8,9]
Example 2:
输入:mat = [[1,2],[3,4]]
输出:[1,2,3,4]
Solution1:自写
class Solution {
public:
vector<int> findDiagonalOrder(vector<vector<int>>& mat) {
int m = mat.size(), n = mat[0].size(), direction = 0;
//direction 为方向代表向右上角遍历还是左下角遍历
int len = m*n;
vector<int> result(len);
for(int i = 0,j = 0,k = 0; k < len; k++){
result[k] = mat[i][j];
if(!direction){
if(--i < 0){
i++;
if(j != n-1)j++;
else i++;
direction = 1;
}
if(!direction && ++j > n-1){
i+=2;
j--;
direction = 1;
}
}
else{
if(++i > m-1){
i--;
j++;
direction = 0;
}
if(direction && --j < 0){
j++;
direction = 0;
}
}
}
return result;
}
};
Solution2:官方题解
class Solution {
public:
vector<int> findDiagonalOrder(vector<vector<int>>& mat) {
int m = mat.size();
int n = mat[0].size();
vector<int> result;
for (int i = 0; i < m + n - 1; i++) {
if (i % 2) {
int x = i < n ? 0 : i - n + 1;
int y = i < n ? i : n - 1;
while (x < m && y >= 0) {
result.emplace_back(mat[x][y]);
//插入元素
x++;
y--;
}
} else {
int x = i < m ? i : m - 1;
int y = i < m ? 0 : i - m + 1;
while (x >= 0 && y < n) {
result.emplace_back(mat[x][y]);
x--;
y++;
}
}
}
return result;
}
};。