《LeetCode笔记16》:对角线遍历

题目:

给定一个含有 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 。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/diagonal-traverse/

解法一:

最笨的方法(分情况讨论):

遍历过程共有两种状态:对角线遍历和对角线方向转换。

对角线遍历:右上RU和左下LB两个方向。

对角线方向转换:(转换条件)对角线方向上没有值

                             (转换方向)RU时先右后下,LB时先下后右

结束条件:最终得到的坐标是(h,w)或不在矩阵范围。

class Solution:
    def findDiagonalOrder(self, matrix: List[List[int]]) -> List[int]:
        if not matrix:
            return []
        h = len(matrix)
        w = len(matrix[0])
        S = 0 #0为右上状态,1为左下状态
        h0 = 0
        w0 = 0
        lists = []
        lists.append(matrix[h0][w0])
        while(1):
            if S == 0:
                h1 = h0-1
                if(h1<0):
                    S = 1
                    h1 = h0
                w1 = w0+1
                if(w1==w):
                    S = 1
                    h1 = h0+1
                    w1 = w0                
            elif S == 1:
                w1 = w0-1
                if(w1<0):
                    S = 0
                    w1 = w0
                h1 = h0+1
                if(h1==h):
                    S = 0
                    w1 = w0+1
                    h1 = h0
            h0 = h1
            w0 = w1
            if h0<h and w0<w:
                lists.append(matrix[h0][w0])
            else:
                return lists

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值