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

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

解释:
LeetCode 对角线遍历
说明:
给定矩阵中的元素总数不会超过 100000 。
思路分析: 不难发现每次都在重复一个过程——斜向右上扫描,斜向左下扫描

class Solution {
public:
	vector<int> findDiagonalOrder(vector<vector<int>>& matrix) {
		vector<int> resultVec;
		int rowSize = matrix.size();
        if (rowSize == 0){
            return resultVec;
        }
        int colSize = matrix[0].size();
		int cnt = rowSize * colSize, row = 0, col = 0;//cnt是任然需要扫描的个数,row,col为即将扫描的坐标
		while (cnt > 0) {
            //斜向右上扫描
			resultVec.push_back(matrix[row][col]);
			cnt -= 1;
			while (row - 1 >= 0 && col + 1 < colSize) {
				row -= 1;
				col += 1;
				resultVec.push_back(matrix[row][col]);
				cnt -= 1;
			}
            //转向
			if (row == 0 && col != colSize - 1) {
                //右上遇到上边界(除右上顶点之外)
				col += 1;
			}
			else if (col == colSize - 1) {
                //右上遇到右边界
				row += 1;
			}
			if (cnt > 0) {
                //斜向左下扫描
				resultVec.push_back(matrix[row][col]);
				cnt -= 1;
				while (row + 1 < rowSize && col - 1 >= 0) {
					row += 1;
					col -= 1;
					resultVec.push_back(matrix[row][col]);
					cnt -= 1;
				}
                //转向
				if (col == 0 && row != rowSize - 1) {
                    //左下遇到左边界(除左下顶点之外)
					row += 1;
				}
				else if (row == rowSize - 1) {
                    //左下遇到下边界
					col += 1;
				}
			}
		}
		return resultVec;
	}
};

LeetCode 对角线遍历

相关文章: