給定一個含有 M x N 個元素的矩陣(M行,N列),請以對角線遍歷的順序返回這個矩陣中的所有元素,對角線遍歷如下圖所示。
示例:
輸入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] 輸出: [1,2,4,7,5,3,6,8,9] 解釋:
有類題屬於直觀上很好理解,但是寫起來卻不知如何下手。這題就屬於此類。這道題好處是給了一個圖例,而圖例又不像另一種4向(右,左下,下,右上)畫法讓人誤導,而是對角線,方向是右上、左下依次交替。因此,只需確定每條對角線的起點,由起點向右上延伸直到邊界,再根據當前所在的行數判斷是否需要逆序即可。
每行的起始點如下:從[0,0]向下延伸到[m-1,0],再向右延伸到[m-1][n-1]
代碼如下:
class Solution {
public:
vector<int> findDiagonalOrder(vector<vector<int>>& matrix) {
vector<int> result;
int m = matrix.size();
if(m == 0) return result;
int n = matrix[0].size();
if(m == 0) return result;
for(int i = 0, j = 0; i+j < m+n-1; ) { // 起點位置(0,0)->(m-1,0)->(m-1,n-1),然後每個起點右上延伸直到邊界,每隔一行翻轉一下
vector<int> tmp;
bool bflag = (i+j) & 0x01;
if(i < m) {
for(int x = i, y = 0; x>=0 && y<n; x--,y++) {
tmp.push_back(matrix[x][y]);
}
i++;
}
else if(i >= m) {
for(int x = i-1, y = j+1; x>=0 && y<n; x--,y++) {
tmp.push_back(matrix[x][y]);
}
j++;
}
if(bflag) { // bflag需要判斷i+j,但是由於上面i和j已經累加了,所以要用bflag判斷
reverse(tmp.begin(), tmp.end());
}
result.insert(result.end(), tmp.begin(), tmp.end());
}
return result;
}
};