剑指offer29.顺时针打印矩阵(边界收缩)

题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

常规做法:
思路为:将矩阵的上t、下b、左l、右r四个边界用于打印的res列表,然后进行从左向右、从上到下、从右到左和从下到上的顺序进行循环(根据边界将元素按顺序添加到res列表的尾部,边界向内收缩1,判断边界是否相遇)
 

class Solution:
    def spiralOrder(self,matrix:List[List[int]])->List[int]:
    t,b,l,r,res=0,len(matrix)-1,0,len(matrix[0])-1,[]
    if not matrix:
        return []
    while True:
        if l>r:break
        for i in range(l,r+1):
            res.append(matrix[t][i])
        t+=1
        if t>b:break
        for j in range(t,b+1):
            res.append(matrix[j][r])
        r-=1
        if l>r:break
        for k in range(r,l-1,-1):
            res.append(matrix[b][k])
        b -=1
        if t>b:break
        for m in range(b,t-1,-1):
            res.append(matrix[m][l])
        l+=1
        if l>r:break
    return res

大佬方法5行代码:
思路为:将矩阵第一行的元素添加到res列表里,删除第一行(也就是matrix中的第一个列表),然后逆时针旋转(通过转置+倒序实现),新的matrix的第一行即为接下来要打印的元素。巧妙用了zip函数。(我很佩服,但是面试的时候不是很推荐,因为我认为算法主要考的是思路,整个思考的过程)

class Solution:
    def spiralOrder(self,matrix:List[List[int]])->List[int]:
        res = []
        while matrix:
            res += 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、付费专栏及课程。

余额充值