题目描述
给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。
示例:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,4,7,5,3,6,8,9]
解释:
说明:
给定矩阵中的元素总数不会超过 100000 。
思路解析
我们可以知道每一条斜线上的座标之和为一个固定的值,从0
到m+n
。如果我们以这个和作为大循环遍历的话(for(int s=0; s<=m+n;s++)
),我们只需要去确定行或者列中的一个,我们就可以通过总和s减去行或者列得到另一个。以行为例,如果我们知道行座标r
的范围,那么s-r
就是纵座标的值。
那现在的问题就是如何确定行座标的值。
当s
小于行座标的总数时,行座标的最大值为s
,否者为m = matrix.size()-1
。程序里面表示为int max_r = min(s, m);
,(对应第0列边界)。
当s
很大时,大到被最后一列限制的时候,此时行座标的最小值为s-n
,否者为0。程序里面表示为int min_r = max(0, s-n)
,(对应第最后一列边界)。
C++实现
class Solution {
public:
vector<int> findDiagonalOrder(vector<vector<int>>& matrix) {
vector<int> ans;
if (matrix.empty()) return ans;
int m = matrix.size()-1;
int n = matrix[0].size()-1;
for(int s=0; s<=m+n;s++){
int min_r = max(0, s-n);
int max_r = min(s, m);
if(s%2==1){
for(int r=min_r; r<=max_r; ++r){
ans.push_back(matrix[r][s-r]);
}
} else {
for(int r=max_r; r>=min_r; --r){
ans.push_back(matrix[r][s-r]);
}
}
}
return ans;
}
};