498 对角线遍历(找规律)

1. 问题描述:

给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。
示例:
输入:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
输出:  [1,2,4,7,5,3,6,8,9]
解释:

说明:
给定矩阵中的元素总数不会超过 100000 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/diagonal-traverse

2. 思路分析:

对于这种题目我们主要是看怎么样枚举即可,我们可以枚举每一条对角线,分为偶数下标与奇数下标进行枚举,偶数下标的时候从下往上的方向记录答案,奇数下标的时候从上往下的方向记录答案,我们可以先确定一个方向的枚举规律,这里以偶数下标为例(从下往上枚举行),可以发现横坐标为行数与当前枚举的是第i条对角线的最小值,到什么时候枚举结束呢?我们可以找一下最后一个位置的的行号,可以发现最后一个位置的行号为r - 1,那么从后往前需要减去的对角线数目得到的最小的行号为r - 1 - (r + c + 2 - i),整理一下可以得到1 - c + i,可以验证一下是正确的,当我们确定了一个方向之后的规律之后那么另外一个方向就是相反的,调整遍历的顺序即可。

3. 代码如下:

from typing import List


class Solution:
    def findDiagonalOrder(self, w: List[List[int]]) -> List[int]:
        res = list()
        r, c = len(w), len(w[0])
        if r == 0 or c == 0: return res
        for i in range(r + c - 1):
            # 分为奇数下标与偶数下标
            if i % 2 == 0:
                j = min(i, r - 1)
                while j >= max(0, 1 - c + i):
                    res.append(w[j][i - j])
                    j -= 1
            else:
                j = max(0, 1 - c + i)
                while j <= min(i, r - 1):
                    res.append(w[j][i - j])
                    j += 1
        return res
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值