498. 對角線遍歷 解題報告

原題鏈接

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章