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

128 篇文章 0 订阅

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

示例 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=<r and t=<b 如果一旦不满足这个条件 循环结束退出,遍历结束
        #等于的这个情况是只有一个元素的时候;左右边界就是相等的。
        l, r, t, b, res = 0, len(matrix[0]) - 1, 0, len(matrix) - 1, []
        while True:
            #先从左往右打印,打印一行top就增加1,第二轮转过来肯定到第三行去了
            for i in range(l, r + 1):
                res.append(matrix[t][i]) 
            t += 1
            #如果top都大于bottom 说明循环就结束了
            if t > 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

#奇技淫巧
res = []
while matrix:
      res.extend(matrix.pop(0))
      matrix = list(zip(*matrix))[::-1]
return res

 

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值