498. Diagonal Traverse

博客给出一个矩阵元素遍历示例,输入矩阵按特定规则输出元素序列。介绍了方法1,思路是根据奇偶性判断遍历方向,每条线满足i + j = k,k上界为m + n - 2,还指出易错点,即i、j完全满足边界条件才推入结果。

498. Diagonal Traverse


Given a matrix of M x N elements (M rows, N columns), return all elements of the matrix in diagonal order as shown in the below image.

Example:

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

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

Explanation:
在这里插入图片描述

Note:

The total number of elements of the given matrix will not exceed 10,000.

方法1:

思路:

根据奇偶性来判断遍历的方向,每一条线满足i + j = k, k的上界是m + n - 2。

易错点:

  1. 只有当i,j完全满足边界条件时才推入结果,注意上面的对角线有划过空格点的情况,比如(0, 3),i 确实是从0开始,但 j 已经超出边界了。
class Solution {
public:
    vector<int> findDiagonalOrder(vector<vector<int>>& matrix) {
        if (matrix.empty() || matrix[0].empty()) return {};
        int m = matrix.size(), n = matrix[0].size(), total = m + n - 2;
        vector<int> result;
        for (int k = 0; k <= total; k++) {
            if (k % 2) {
                for (int i = 0, j = k - i; i < m && j >= 0; i++, j--) {
                    if (j < n)
                        result.push_back({matrix[i][j]});
                }
            }
            else {
                for (int j = 0, i = k - j; j < n && i >= 0; j++, i--) {
                    if (i < m)
                        result.push_back({matrix[i][j]});
                }
            }
        }
        return result;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值