LeetCode498 对角线遍历

给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。

 

示例:

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

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

解释:

 

说明:

  1. 给定矩阵中的元素总数不会超过 100000 。

//章节 - 数组和字符串    
//二、二维数组简介
//1.对角线遍历
/*
算法思想:
    有类题属于直观上很好理解,但是写起来却不知如何下手。这题就属于此类。
    这道题好处是给了一个图例,而图例又不像另一种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(n == 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;
    }
};

猜你喜欢

转载自www.cnblogs.com/parzulpan/p/10061321.html