【LeetCode】498. 對角線遍歷

題目描述

  給定一個含有 M x N 個元素的矩陣(M 行,N 列),請以對角線遍歷的順序返回這個矩陣中的所有元素,對角線遍歷如下圖所示。

示例:

輸入:

[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]

輸出:  [1,2,4,7,5,3,6,8,9]

解釋

說明:

  給定矩陣中的元素總數不會超過 100000 。

思路解析

  我們可以知道每一條斜線上的座標之和爲一個固定的值,從0m+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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章