
剑指 Offer 29. 顺时针打印矩阵
初始化四个指针:left(左边界)、right(右边界)、top(上边界)、bottom(下边界)。 顺序遍历: 逐步收缩四个指针,直到所有元素都被访问。 将矩阵的行转换为列,通过 将转置后的矩阵沿着垂直轴翻转,即 逐次将第一行移除,直到矩阵为空。
发布日期:2021-05-08 03:55:24
浏览次数:9
分类:精选文章
本文共 1890 字,大约阅读时间需要 6 分钟。
顺时针打印矩阵
问题描述
给定一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例
示例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]
约束条件
- 0 ≤ matrix.length ≤ 100
- 0 ≤ matrix[i].length ≤ 100
方法一:普通解法
方法思路
我们可以通过逐层遍历矩阵来实现顺时针打印。具体步骤如下:
- 从左到右遍历当前的行。
- 从上到下遍历当前的列。
- 从右到左遍历当前的行。
- 从下到上遍历当前的列。
解决代码
#includeusing namespace std;vector spiralOrder(vector > matrix) { vector res; if (matrix.empty()) return res; int left = 0, right = matrix[0].size() - 1; int top = 0, bottom = matrix.size() - 1; while (true) { // 从左到右 for (int i = left; i <= right; ++i) { res.push_back(matrix[top][i]); } if (++top > bottom) break; // 从上到下 for (int i = top; i <= bottom; ++i) { res.push_back(matrix[i][right]); } if (left > --right) break; // 从右到左 for (int i = right; i >= left; --i) { res.push_back(matrix[bottom][i]); } if (top > --bottom) break; // 从下到上 for (int i = bottom; i >= top; --i) { res.push_back(matrix[i][left]); } if (++left > right) break; } return res;}
代码解释
- 初始化四个指针:
left
、right
、top
、bottom
,分别表示矩阵的左、右、上、下边界。 - 使用
while
循环逐层遍历矩阵。 - 每层遍历时,分别从左到右、上到下、右到左、下到上打印元素。
- 逐步收缩边界指针,直到所有元素都被访问。
方法二:神仙解法
方法思路
这个方法利用了矩阵的转置和翻转特性:
zip(*matrix)
实现。[::-1]
。这种方法非常简洁,易于实现。
解决代码
def spiralOrder(matrix): res = [] while matrix: res += matrix.pop(0) matrix = list(zip(*matrix))[::-1] return res
代码解释
- 使用
while
循环处理非空矩阵。 - 每次将矩阵的第一行添加到结果列表中。
- 将剩余的矩阵转置并翻转,继续处理。
- 当矩阵为空时,循环结束并返回结果。
总结
以上是两种解决方案的实现方式。第一种方法通过逐层遍历实现,逻辑清晰但代码稍微复杂;第二种方法利用了矩阵的转置和翻转特性,实现简洁但对转置操作有一定的性能消耗。根据具体需求选择使用哪种方法都可以。
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年04月14日 20时34分50秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
利用递归实现二叉树的前中后序遍历(Python)
2019-03-05
A*寻路算法(Python)
2019-03-05
Python刷题输入输出
2019-03-05
冒泡排序又来啦(C/C++版本)
2019-03-05
python负数存储
2019-03-05
求二维数组中最大值的位置
2019-03-05
python中sort和sorted的区别
2019-03-05
防碰撞算法
2019-03-05
vue中echart数据动态切换,一看就懂
2019-03-05
Python实现理解树,树的遍历,二分查找
2019-03-05
Python3.6爬虫记录
2019-03-05
搞清楚Spring Cloud架构原理的这4个点,轻松应对面试
2019-03-05
1月份2月份GitHub上最热门的23个Java开源项目
2019-03-05
maven安装
2019-03-05
2020第十五届全国大学生智能汽车竞赛——4X4矩阵键盘+Flash调参系统
2019-03-05
合并两个有序数组
2019-03-05
Ubuntu 环境下使用中文输入法
2019-03-05
小白学习Vue(?)--model选项的使用(自定义组件文本框双向绑定)
2019-03-05
聊聊我的五一小假期
2019-03-05
面向对象之异常处理:多路捕获
2019-03-05