《Leetcode》面试题29. 顺时针打印矩阵

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

示例 1:

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

示例 2:

输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

思路:

1、题目分析

这个题目的要求就是打印一个环,这个环是从外到内。

2、解题分析

打印分四个方向:左->右;上->下;右->左;下->上。有四个方向就是四个边界,left,right,top,bottom=0,len(matrix[0])-1,0,len(matrix);而且满足left<=right and top<=bottom;如果不满足这个情况就遍历结束。这每一个方向的变化是不同的,但是又有相似之处,下面以一一分解:①左->右;对于这个方向来说,二维矩阵的上边界减少1,其余不变。②上->下;对于这个方向来说二维矩阵的右边界减少1;因此①②遍历结束以这个二维矩阵的上边界加1和右边界减1。而在这个时候上边界要判断和下边界的大小,右边界要判断和左边界的大小。同理可得,左->右 和 下->上。是分别要判断和左右边界大小、上下边界大小。接下来代码说明:

class Solution:
    def spiralOrder(self, matrix:[[int]]) -> [int]:
        #如果矩阵为空,返回一个空列表
        if not matrix: 
            return []
        #定义上下左右四个边界
        #这四个边界满足l= b: 
                break
            #从上往下打印,当然横坐标是top+1开始,top层已经遍历过了
            for i in range(t, b + 1): 
                res.append(matrix[i][r])
            #遍历完右边这一列,右边的边界不得不减1 
            r -= 1
            #如果左边界大于右边界循环结束
            if l > r: 
                break
            #从右往左得起始坐标当然是r-1,因为右边那一列已经遍历结束了
            for i in range(r, l - 1, -1): 
                res.append(matrix[b][i])
            #遍历完下边得一层bottom自然而然要减去1
            b -= 1
            #再次判断top和bottom的大小关系
            if t > b: 
                break
            #从下往上,起始坐标当然是b-1.bottom已经遍历结束
            for i in range(b, t - 1, -1): 
                res.append(matrix[i][l]) 
            #左侧遍历完l就要往右移动一下
            l += 1
            #如果左边大于右边那就结束遍历
            if l > r: 
                break
        return res

总结:这个题目的关键点就是找到四个方便变化的状态和终止遍历的条件。

你可能感兴趣的:(Leetcode,数组)