LeetCode - 对角线遍历

一. 题目

给定一个含有 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,首先,按照我的问题分析习惯,先给这个题目做一个定位,这是一道斜对角遍历数组的题目

2,进一步分析,并不是纯粹的斜对角遍历,确定遍历开始的起始元素和遍历方向是一个麻烦的事情。

3,画一个4*4的图,基本就把所有情况都列出来了,然后开始编码

4,总之,就是包含三个部分,斜对角遍历,更换起始位置,确定遍历方向。

三. 代码

class Solution(object):
    def findDiagonalOrder(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: List[int]
        """
        sign = 1 # 1 is up, -1 is down
        index_0 = 0
        index_1 = 0
        
        result = []
        while index_0 != len(matrix) and index_1 != len(matrix[0]):
            result.append(matrix[index_0][index_1])
            if sign == 1:
                if index_1 == len(matrix[0]) - 1:
                    sign = -1 
                    index_0 += 1
                elif index_0 == 0:
                    sign = -1
                    index_1 += 1
                else:
                    index_0 -= 1
                    index_1 += 1
            elif sign == -1:
                if index_0 == len(matrix) - 1:
                    sign = 1
                    index_1 += 1
                elif index_1 == 0:
                    sign = 1
                    index_0 += 1
                else:
                    index_0 += 1
                    index_1 -= 1
        return result
 

四. 参考资料

1. leetcode: https://leetcode-cn.com/problems/diagonal-traverse/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值