剑指 Offer(第2版)面试题 29:顺时针打印矩阵

【S32K】S32K144入门笔记(3) SPI(lpspi组件) 0. 引言 与第二篇can对应,第三篇本来想写lin的,毕竟都是车身上常用的总线。但是lin比较麻烦,所以先拖后一下,先把SPI记录一下。 SPI在我们的系统架构中是S32K和ADAS之间做数据传输用的,毕竟速率够高,数据量能传的比较大。 1. 准备 1.1 SPI基础知识 1.2 开发环境 1.2.1 软件开发环境 1.2.2 硬件环境 SPI 2. Demo ... 阅读详情

剑指 Offer(第2版)面试题 29:顺时针打印矩阵

题目来源:40. 顺时针打印矩阵

解法1:按层模拟

可以将矩阵看成若干层,首先输出最外层的元素,其次输出次外层的元素,直到输出最内层的元素。

定义矩阵的第 k 层是到最近边界距离为 k 的所有顶点。

设矩阵的行数和列数分别是 m 和 n,初始化边界标记:left = 0,right = n - 1,top = 0,buttom = m - 1。

对于每层,从左上方开始以顺时针的顺序遍历所有元素。假设当前层的左上角位于 (top, left),右下角位于 (bottom, right),按照如下顺序遍历当前层的元素:

  1. 从左到右遍历上侧元素:范围是 (top, left) 到 (top, right),之后上边界下移,即 top++;
  2. 从上到下遍历右侧元素:范围是 (top, right) 到 (buttom, right),之后右边界左移,即 right–;
  3. 从右到左遍历下侧元素:范围是 (buttom, right) 到 (buttom, left),之后下边界上移,即 buttom++;
  4. 从下到上遍历左侧元素:范围是 (buttom, left) 到 (top, left),之后左边界右移,即 left++。

进入下一层继续遍历,直到遍历完所有元素为止。

代码:

class Solution
{
public:
	vector<int> printMatrix(vector<vector<int>> matrix)
	{
		// 特判
		if (matrix.empty() || matrix[0].empty())
			return {};
		int m = matrix.size(), n = m ? matrix[0].size() : 0;
		vector<int> nums(m * n, 0);
		int index = 0; // 数组下标
		// 边界标记
		int left = 0, right = n - 1, top = 0, buttom = m - 1;
		while (index < m * n)
		{
			// 向右
			for (int j = left; j <= right && index < m * n; j++)
				nums[index++] = matrix[top][j];
			top++; // 上边界下移
			// 向下
			for (int i = top; i <= buttom && index < m * n; i++)
				nums[index++] = matrix[i][right];
			right--; // 右边界左移
			// 向左
			for (int j = right; j >= left && index < m * n; j--)
				nums[index++] = matrix[buttom][j];
			buttom--; // 下边界上移
			// 向上
			for (int i = buttom; i >= top && index < m * n; i--)
				nums[index++] = matrix[i][left];
			left++; // 左边界右移
		}
		return nums;
	}
};

复杂度分析:

时间复杂度:O(m*n),其中 m 和 n 分别是矩阵的行数和列数。每个矩阵元素都要遍历一次。

空间复杂度:O(1)。仅用到若干变量,忽略答案数组的空间开销。

解法2:模拟

可以模拟螺旋矩阵的路径。初始位置是矩阵的左上角,初始方向是向右,当路径超出界限或者进入之前访问过的位置时,顺时针旋转,进入下一个方向。

判断路径是否进入之前访问过的位置需要使用一个与输入矩阵大小相同的辅助矩阵 visited,其中的每个元素表示该位置是否被访问过。当一个元素被访问时,将 visited 中的对应位置的元素设为已访问。

如何判断路径是否结束?

由于矩阵中的每个元素都被访问一次,因此路径的长度即为矩阵中的元素数量,当路径的长度达到矩阵中的元素数量时即为完整路径,将该路径返回。

代码:

class Solution
{
private:
	// 方向数组,按顺序分别是:向右、向下、向左、向上
	static constexpr int directions[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};

public:
	vector<int> printMatrix(vector<vector<int>> matrix)
	{
		if (matrix.empty() || matrix[0].empty())
			return {};
		int m = matrix.size(), n = m ? matrix[0].size() : 0;
		vector<int> nums(m * n, 0);
		vector<vector<bool>> visited(m, vector<bool>(n, false));
		int r = 0, c = 0;
		int directionIndex = 0;
		for (int index = 0; index < m * n; index++)
		{
			nums[index] = matrix[r][c];
			visited[r][c] = true;
			int next_r = r + directions[directionIndex][0], next_c = c + directions[directionIndex][1];
			// 遇到边界,转向
			if (next_r < 0 || next_r >= m || next_c < 0 || next_c >= n || visited[next_r][next_c])
				directionIndex = (directionIndex + 1) % 4;
			r += directions[directionIndex][0];
			c += directions[directionIndex][1];
		}
		return nums;
	}
};

复杂度分析:

时间复杂度:O(m*n),其中 m 和 n 分别是矩阵的行数和列数。矩阵中的每个元素都要被访问一次。

空间复杂度:O(m*n),其中 m 和 n 分别是矩阵的行数和列数。需要创建一个大小为 m*n 的矩阵 visited 记录每个位置是否被访问过。

VC中sqlite的使用 在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示 立即下载

相关推荐

从零到英雄:Spring Boot 微服务架构全攻略

在数字化转型的时代,微服务架构已成为构建可扩展、高可用系统的首选方案。本文以“从零到英雄”为主题,详细指导读者使用Spring Boot快速构建微服务帝国。从基础环境搭建入手,逐步深入到服务发现、配置管理、负载均衡、断路器、API网关、安全认证、监控与部署等核心模块。通过大量代码示例和详细解释,包括中文注释,帮助初学者和中级开发者掌握Spring Boot的核心概念和技术实践。文章强调实际操作,涵盖RESTful API开发、数据库集成、容器化部署等内容,并讨论常见问题与优化策略。无论你是Java开发者还是

一个被知识诅咒的人 2697

剑指Offer(第2版)——面试题29:顺时针打印矩阵

题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如,如果输入如下矩阵:               则依次打印出数字:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10。 1.解题思路: 我们可以把一个矩阵想象成若干个圈,用一个循环来打印矩阵,每次打印矩阵中的一个圈。 ...

qq_32486393的博客 193

【LPDDR4 - 学习二】LPDDR4 介绍 ——LPDDR4 芯片引脚说明解析

本文系统解析了LPDDR4内存芯片的引脚定义与特性,重点介绍了272球POPFBGA封装的双通道架构。内容涵盖电源管理(三级供电架构与上电时序)、控制信号(差分时钟与复用命令总线)、数据接口(16位双向数据总线与选通信号)以及校准复位等核心模块。通过表格详细列明了各引脚电压范围、功能定义及工程注意事项,并附有典型封装球位分布图。全文基于JEDEC标准,为移动设备内存设计提供全面的硬件参考,特别强调电源时序控制、信号完整性及抗干扰设计等关键点。

zap15622077817的博客 2634

【剑指offer】面试题29 顺时针打印矩阵

题目要求 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 题目分析 对于给定的矩阵: 想要从内到外依次顺时针打印出每一个数字,我们先考虑如何顺时针打印出每个数字,实际上,我们...

爱喝舒化奶的博客 287

IPD实战指南:如何运用SPAN模型精准定位高潜力市场并优化资源配置

本文是IPD实战指南,详细解析了如何运用SPAN模型进行市场分析与战略决策。文章通过四步实战法,指导企业科学定义细分市场、量化评估吸引力与竞争力,并绘制矩阵以制定精准的资源配置策略,从而跳出红海竞争,将资源聚焦于高潜力市场。

weixin_29306317的博客 73

PID调参避坑手册:用APM/PX4飞控让无人机稳如老狗

本文提供了一份针对APM/PX4飞控的PID调参实战指南。文章从理解PID控制原理出发,详细解析了级联控制结构,并给出了从内环到外环的五步调参流程与数据日志分析方法,帮助无人机爱好者避开常见误区,实现稳定飞行。

red88的博客 873

剑指offer29: 顺时针打印矩阵 python

剑指offer29: 顺时针打印矩阵 python题目描述解法 题目描述 解法 利用python的函数,观察发现,应该是先输入第一行之后把第一行pop然后转置,反向之后再输出第一行,具体的流程可以看下图~有一些些不太清晰~ 具体代码如下: class Solution: def spiralOrder(self, matrix: List[List[int]]) -> List[int]: res = [] while matrix:

weixin_43494312的博客 324

课程复习---分析空间数据的细胞空间关系(python版本的mistyR)

课程复习---分析空间数据的细胞空间关系(python版本的mistyR)

weixin_53637133的博客 1220

剑指offer第19题:顺时针打印矩阵

剑指offer第19题:顺时针打印矩阵题目描述顺时针打印矩阵源码 题目描述 顺时针打印矩阵 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 源码 class Solution ...

可爱的小腊肉 386

机器人中的数值优化(二十一)—— 伴随灵敏度分析、线性方程组求解器的分类和特点、优化软件

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,下半部分介绍带约束的优化,中间会穿插一些路径规划方面的应用实例

慕羽★的博客 4205

轨迹优化 | 图解欧氏距离场与梯度场算法(附ROS C++/Python实现)

距离场在运动规划中则常用于地图建模和轨迹梯度优化。本文图解欧氏距离场EDT的算法原理,并基于双线性插值给出欧氏梯度场的公式推导,并给出ROS C++和Python的算法实现加深理解

FRIGIDWINTER的博客 4644

leetcode 剑指 Offer 29. 顺时针打印矩阵 经典的蛇形矩阵问题

剑指 Offer 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] 限制: 0 <= matrix.length <= 100 0 <= matrix[

马角的逆袭的博客 400

RK3588S之CPU--benchmark(一)

本章会基于RK3588S来介绍有关CPU常用的benchmark工具及测试过程

文艺小少年的博客 1498

【剑指Offer】面试题29:顺时针打印矩阵——JS实现

一、顺时针打印NxN矩阵 题目描述: 输入一个正整数N,输出一个NxN矩阵。示例如下: 代码如下: function PrintMatrix(n){ let result = []; let number = 1; let start = 0; // 生成一个NxN空矩阵 for(let i = 0; i < n; i++){ ...

Dora_5537的博客 858

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

剑指offer系列之顺时针打印矩阵

本题是牛客网剑指offer系列中的顺时针打印矩阵, 题目意思简洁明了, 按照从外到内顺时针的顺序打印矩阵中的每一个数字. 因为实验室师兄在面试中遇到了两次问这个问题的, 所以就来复习一下, 分享几个思路. 思路一 该思路较为直接, 如同剥洋葱一样, 一层一层剥开它的心. 用 4 个整数来表示当前矩阵圈的左右上下边, 每次顺时针打印一圈, 然后再改变这 4 个整数. 主要问题是在于对于最后出...

mrbm_lj的博客 157

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

剑指offer—29.顺时针打印矩阵—分析及代码(Java)

剑指offer——29.顺时针打印矩阵——分析及代码[Java]一、题目二、分析及代码1. 依次打印(1)思路(2)代码(3)结果三、其他 一、题目 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 二、分析及代码 1. 依次打印 (1)思路 从外向里,依次循环打印

江南土豆的博客 262

剑指offer 面试题29:顺时针打印矩阵

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 例如,如果输入如下矩阵: 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 思路:   先判断循环条件,由图可以发现当行数和列数都 > 循环起始点(左上角)* 2时,循环开始。    可以循环之后,就要打印一圈,打印一圈有如下几种情况:   1.向左打印,向左打印适合所有情况。    2.从上向下打印,终止行号要大于起始行号。   3.从右向左打印,除了终止行号要大于起始行号外,还需终止列号

Peanut的博客 598

剑指Offer——面试题29:顺时针打印矩阵

面试题29:顺时针打印矩阵 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 #include <iostream> #include <algorithm> #include <cmath> #include <cstring> using namespace std; void PrintMatrixInCircle(int...

愿你慢慢变强的博客 330

《剑指offer》面试题29:顺时针打印矩阵(C++实现)

《剑指offer》面试题29:顺时针打印矩阵(C++实现)题目描述解决思路代码实现小结参考文献 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 解决思路 -每打印一圈...

weixin_43850408的博客 550

js剑指offer-19-顺时针打印矩阵

剑指offer19-顺时针打印矩阵 题目描述   输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. const printMatrix = matrix =&gt; { ...

julian_draxler的博客 741

剑指offer面试题29(java版):顺时针打印矩阵

welcome to my blog 剑指offer面试题29(java版):顺时针打印矩阵 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 思路 主要是要弄清楚打...

littlehaes的博客 301

《剑指offer》面试题29:顺时针打印矩阵

更多剑指offer面试习题请点击:《剑指offer》(第二版)题集目录索引 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如,如果输入如下矩阵: /* 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 */ 则依次打印出数字 1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,1

Tianzez的博客 607

LeetCode刷题日记 剑指 Offer 29. 顺时针打印矩阵

之前几天在看吴恩达,LeetCode停了几天,今天重新开始,希望之后每天能抽出时间写几道。 这道题目是剑指offer上的第29题,顺势正打印矩阵。题目给出一个由数组构成的矩阵,要求顺时针顺序从里到外打印出每一个数字,代码如下: class Solution { public: vector<int> spiralOrder(vector<vector<int>>& matrix) { if (matrix.size() == 0 ||

AlexNbZou的博客 176

剑指 Offer 29. 顺时针打印矩阵 - leetcode 剑指offer系列

题目难度: 简单 原题链接 今天继续更新剑指 offer 系列, 这道题可以从多个角度思考, 这里提供两种方案, 且对代码进行了一些精简和优化, 供大家参考 老样子晚上 6 点 45 分准时更新公众号 每日精选算法题, 大家记得关注哦~ 另外在公众号里回复 offer 就能看到剑指 offer 系列当前连载的所有文章了 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 0 <= matrix.length <= 100 0 <= matrix[i].

随便发挥的博客 247

剑指Offer对答如流系列 - 顺时针打印矩阵

文章目录面试题29:顺时针打印矩阵一、题目描述二、问题分析三、问题解答 面试题29:顺时针打印矩阵 一、题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 比如:输入以下矩阵 打印出的数字为1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10 二、问题分析 每次打印都是打印外面的一圈,每次打印矩阵的起点横纵坐标都相同(横纵坐标值均设置为start),...

明月沉江春雾晓 1170

python实现顺时针打印矩阵

python实现顺时针打印矩阵 题目来自:剑指offer 问题描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10 解题思路:每次打印并删除矩阵的第一行,然后将矩阵逆时针翻转90...

wul的博客 1547

剑指offer之顺时针打印矩阵

剑指offer之顺时针打印矩阵 题目描述解题思路Code 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 解题思路 附上评论区的热门代码: //链接:https:...

gq__97的博客 160
上一篇: 剑指 Offer(第2版)面试题 25:合并两个排序的链表
下一篇: 剑指 Offer(第2版)面试题 28:对称的二叉树
UestcXiye
博客等级 码龄8年 9027粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值