给你一个大小为 m x n 的矩阵 mat ,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。
示例 1:
输入:mat = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,4,7,5,3,6,8,9]
示例 2:
输入:mat = [[1,2],[3,4]]
输出:[1,2,3,4]
提示:
m == mat.length
n == mat[i].length
1 <= m, n <= 104
1 <= m * n <= 104
-105 <= mat[i][j] <= 105
解题思路:
观察规律,遍历方向由层数决定,层数=i+j,层数为奇数向下遍历,层数为偶数向上遍历。
代码:
class Solution {
public:
vector<int> findDiagonalOrder(vector<vector<int>>& mat) {
int m = mat.size(),n = mat[0].size(),i=0,j=0;
vector<int> ans(m*n,0);
for(int k=0;k<ans.size();k++){
ans[k] = mat[i][j];
//层数为奇数,向下遍历
if((i+j)%2 != 0){
if(i == m-1){ //i是最后一行,j++,用于向上遍历
j++;
}else if(j==0){ //j是最后一列,i++,用于向上遍历
i++;
}else{ //向下走
i++;
j--;
}
}else{ //层数为偶数,向上遍历
if(j == n-1){
i++;
}else if(i == 0){
j++;
}else{
i--;
j++;
}
}
}
return ans;
}
};