LeetCode刷题记录——第498题(对角线遍历)

版权声明:此BLOG为个人BLOG,内容均来自原创及互连网转载。最终目的为记录自己需要的内容或自己的学习感悟,不涉及商业用途,转载请附上原博客。 https://blog.csdn.net/bulo1025/article/details/89285063

题目描述

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

示例:

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

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

解释:
在这里插入图片描述

思路分析

  • number 记录当前还需要放入结果列表的数有多少个
  • 首先分析向右上方遍历的情况
    – 1.第一步向右上遍历,但无法向上,所以是向右遍历,条件是,当 i == 0 时,j + 1 ,并且将向上姿态更新为向下。
    – 2.正常的向右上,这里需要 i 减1,j 加1。
    – 3.无法向右遍历了,因为到了最后一列,所以条件是:当 j == 列长度-1的时候,就直接向下,并且将向上姿态更新为向下。
  • 向左下方遍历的情况
    – 1.往左下,当前列是0的时候,只能往下了,条件是:j == 0 时,i += 1,并且需要将姿态更新为向上。
    – 2. 正常往左下,条件是:i += 1, j -= 1。
    – 3.往左下,当前行为最后一行,只能往右,条件是:i = 最后一行,j += 1,并且需要将姿态更新为向上。

代码示例

class Solution(object):
    def findDiagonalOrder(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: List[int]
        """
        if matrix == []:
            return []
        row,col = len(matrix),len(matrix[0])
        ans = []
        number = row * col
        i = j = 0
        up = True
        while number:
            number -= 1
            ans.append(matrix[i][j])    # 将所在的数append进去
            if up:
                if j == col - 1: # 如果上行,
                    i += 1 # 加一行
                    up = False
                elif i == 0: # 在第一行,不能上行了
                    j += 1
                    up = False
                else:
                    i -= 1
                    j += 1
            else:
                if i == row - 1: # 如果行到了最后一行
                    j += 1
                    up = True  # 需要向右上移动了
                elif j == 0:
                    i += 1
                    up = True
                else:
                    i += 1
                    j -= 1
        return ans
    

2019年4月13日 于燕园北

猜你喜欢

转载自blog.csdn.net/bulo1025/article/details/89285063