题目:
给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。
示例:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,4,7,5,3,6,8,9]
解释:
说明:
给定矩阵中的元素总数不会超过 100000 。
分析思路:
根据题目的提示,甚至是题目的名字,我们不难发现本题希望我们能够对一个矩阵进行斜着遍历,
正常来讲,如果是一个方阵,如何进行对角线遍历呢?
问题一:一个N*N的方阵,斜着遍历需要几次?
问题二:第i次遍历时,如何实现像上图甩龙一样的遍历顺序:从左下->右上or右上->左下?
问题三:如果不是方阵,上面两个问题的答案有什么变化?
当我们想出了这几个问题的答案,代码就不难编写了
一:N×N的需要遍历 N+ N -1次,M×N的需要 M + N -1次
二:根据i的奇偶关系,可以决定遍历的顺序
代码:
class Solution {
public:
vector<int> findDiagonalOrder(vector<vector<int>>& matrix) {
int M = matrix.size(); // 行
vector<int> result;
if(M == 0)
return result;
int N = matrix[0].size(); // 列
int total = M * N;
// vector<pair<int, int>> index;
// 进行M+N-1次循环
for(int i = 0;i < M+N-1;i++)
{
// 每一次循环push进去i个数据,代表横纵坐标
int row = 0, column = 0; int n = i;
if(n % 2 == 0){ // 如果i为偶数
while(n+1){
row = n;
column = i - row;
if(row < M && column < N){
// index.push_back({row,column});
result.push_back(matrix[row][column]);
}
n--;
}
}
else { // 如果i为奇数
while(n+1){
column = n;
row = i - column;
if(row < M && column < N){
// index.push_back({row,column});
result.push_back(matrix[row][column]);
}
n--;
}
}
}
return result;
}
};