【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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章