题解 | #顺时针打印矩阵#的Python解法

顺时针打印矩阵

http://www.nowcoder.com/practice/9b4c81a02cd34f76be2659fa0d54342a

1. 常规解题思路

此题一画出示例矩阵,就可以找到常规解题思路:找到四个角的边界,然后模拟路径遍历矩阵
图片说明

2. 核心代码:

# -*- coding:utf-8 -*-
class Solution:
    # matrix类型为二维列表,需要返回列表
    def printMatrix(self, matrix):
        # write code here
        #还是先判断矩阵是否存在
        if not matrix:
            return []
        #定义要打印的数组
        res = []
        #定义四个边界角
        l, r, t, b, res = 0, len(matrix[0]) - 1, 0, len(matrix) - 1, []
        while True:
            #从左到右,根据边界打印
            for i in range(l, r + 1): res.append(matrix[t][i]) 
            #边界向内收缩
            t += 1
            #是否打印完毕
            if t > b: 
                break
            #从上到下
            for i in range(t, b + 1): res.append(matrix[i][r]) 
            r -= 1
            if l > r: 
                break
            #从右到左
            for i in range(r, l - 1, -1): res.append(matrix[b][i]) 
            b -= 1
            if t > b: 
                break
            #从下到上
            for i in range(b, t - 1, -1): res.append(matrix[i][l])
            l += 1
            if l > r: 
                break
        return res

3. 复杂度分析:

  • 时间复杂度:O(m*n) (m,n 分别是矩阵的行数和列数)
  • 空间复杂度:O(1) (四个边界 l , r , t , b 使用常数大小的 额外空间( res 为必须使用的空间))

--------------------------------------------------------我是解法二的分割线---------------------------------------------------------------------

4. 解法二:逆转矩阵

4.1 思路 + 图解

但是这个常规解法还是略微复杂点,下面介绍一种逆向思维思路👇:
每剔除矩阵最上面一行数据,并添加到顺序列表;然后逆时针90°旋转剩下的矩阵,重复之前的剔除操作;这样直到矩阵为空
,此时顺序列表的数字就是我们要找的 顺时针打印的数字!

具体步骤可以看下面的这几个示例图:
图片说明
图片说明
图片说明
图片说明
图片说明
图片说明

4.2 核心代码

# -*- coding:utf-8 -*-
class Solution:
    # matrix类型为二维列表,需要返回列表
    def printMatrix(self, matrix):
        # write code here
        res = []                                #定义一个顺序列表
        while matrix:
            res += matrix.pop(0)                #每次去除矩阵最上面一行的数据,并添加到顺序列表中
            matrix = list(zip(*matrix))[::-1]   #紧接着逆时针90°旋转矩阵,重复前面的步骤直到矩阵为空
        return res

4.3 复杂度分析

  • 时间复杂度:O(m*n) (m 和 n 分别为矩阵的行数和列数)
  • 空间复杂度:O(m*n) (同上)
题解 - >剑指Offer和算法篇 文章被收录于专栏

专门用Python来解Offer里的题目,力求用最简单、通俗的方法解决最复杂的问题。

全部评论

相关推荐

机智的豹子有点心碎:UU我还在找工作还没找到,一直在搜简历怎么改,总结了这些: 1.SEO:简历根据每一个岗位定制化:使用这个岗位中所描述的工作的词,它要求什么技能就把自己的技能描述成什么样子,把SEO用在自己身上(把我的简历和个人特质,当成一个热门产品来做 “搜索引擎优化”),让HR能用最低的门槛看到我 2."顺序:把岗位要求的技能跟经历放在简历的最开头、最显眼的位置" 3.包装:简历是一个最终交付说明书,只要最终学习成长做得到就可以,在合适的范围内自我吹捧(我这个人怎么能够在HR的角度被迅速的看懂和看到,减轻HR的工作压力) 4.每点加小标题​:用6~10字概括该段内容,便于面试官快速抓取信息。 5.避免空泛描述​:拒绝“培养了组织能力”等泛泛而谈,替换为具体行动和成果。 6."使用“三段式结构”​​:每段经历按“为什么做-做了什么-结果如何”展开: ​a) 为什么做​:痛点或目标(例如“品牌声量不足”) ​b) 做​了什么:方法论(例如“趋势洞察+竞品对标+人群细分”) ​c) 结果如何​:量化成果或影响(例如“推动客户投放20万预算”)" 7.量化成果​:用数字体现工作成效(如“整理500+份资料”“撰写2万字报告”)。 这些有的是我想去的岗的,如果对你有用的话按需修改就好~加油,早日上岸!
点赞 评论 收藏
分享
评论
19
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务