題目描述
給定一個含有 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;
}
};