面试经典150题——旋转图像

"You are never too old to set another goal or to dream a new dream." - C.S. Lewis​

assorted-color hot air balloons during daytime

1. 题目描述

2.  题目分析与解析

2.1 思路一

还是最简单的尝试模拟人的思维,如果对于一个普通人解决该题目,那就是先把第一行放在最后一列 或者 把第一列倒序放在第一行,接着第二行放在倒数第二列 或者 把第二列逆序放在第二行,以此类推。

但是这样解决是有一个棘手的问题,因为题目提醒我们”原地旋转,直接修改输入的二维矩阵,请不要 使用另一个矩阵来旋转图像”。如果按照我们上述的解法,把某一行或者某一列放在另外某一行或者某一列,那么被填充的部分数据就被覆盖,在后续使用时就无法获取到,所以这种方法是不可行的。

但是我们再来观察一下矩阵:

如果将它转置会得到下图:

而我们需要的是下图:

有没有发现点什么?是不是把矩阵一转置在经过一些列次序变换就能得到结果了?(其实我开始也没想到转置,确实对于矩阵还不够敏感)

所以有了上述思路后,代码思路就比较简单了。

代码思路:

  1. 将矩阵先进行转置

    • 转置其实就是按照主轴反转如下:

    • 这个转置过程只需要遍历矩阵的一半元素,将遍历到的每一个元素与它需要对应的元素做一次交换就可以了。

  1. 把第一列移动到最后一列,第二列移动到倒数第二列,其实也就是每一行逆序,就可以得到答案。

3. 代码实现

4. 相关复杂度分析

为了分析这段代码的时间和空间复杂度,我们需要考虑每一步操作对输入矩阵的影响。这段代码实现了一个矩阵的顺时针旋转90度的操作,分为两个主要步骤:矩阵的转置和水平翻转(或列的交换)。输入矩阵为 n x n(因为旋转操作通常在正方形矩阵上进行)。

第1步:矩阵转置

在矩阵转置步骤中,我们遍历了矩阵的上半部分(不包括对角线),对于每一个元素 matrix[i][j],我们将其和 matrix[j][i] 交换。这个操作只涉及到读取和写入矩阵元素,没有使用额外的存储空间(除了用于交换的临时变量 temp)。

  • 时间复杂度: 对于一个 n x n 的矩阵,这一步的时间复杂度是 O(n^2)。尽管我们只遍历了矩阵的一半,但遍历的总元素数量仍然与矩阵的总元素数量成正比(大约是 n^2 / 2),这意味着时间复杂度保持为 O(n^2)

  • 空间复杂度: 由于我们只使用了固定数量的变量(temp),这一步的空间复杂度是 O(1)

第2步:水平翻转(或列的交换)

在这一步中,代码提供了两种方法来实现旋转的第二部分。不过,这两种方法的复杂度是相同的。

  • 水平翻转:我们遍历矩阵的每一行,将每一行的元素按列进行逆序交换。

  • 列的交换:我们遍历矩阵的一半列,将每一列的元素与对应的对面列的元素进行交换。

无论采用哪种方法,操作的总次数都与矩阵中元素的总数成正比。

  • 时间复杂度: 对于一个 n x n 的矩阵,这一步的时间复杂度也是 O(n^2)。我们需要对每个元素进行操作,尽管是分行或分列操作,总的操作次数仍然与 n^2 成正比。

  • 空间复杂度: 同样,由于我们只使用了固定数量的变量(temp),这一步的空间复杂度是 O(1)

总结

  • 总时间复杂度: O(n^2)。这是因为我们需要对矩阵中的每个元素至少进行一次操作。

  • 总空间复杂度: O(1)。除了输入矩阵之外,我们只使用了常数空间(临时变量)来执行所有操作。

5. 原地旋转(补充)

以下内容引自力扣官方题解(侵权请告知,立删除)

(个人感觉这种方法很巧妙,虽然开始也想到了但是当时被难在移动哪些元素上,看来还是要多动手把发现的规律写一写,尝试把规律变换成数学语言才能进行编程)看解析之前先看一下下面两个图片:

这种思路的困难之处就是用数学语言写出移动规律(毕竟计算机不能懂规律只能靠数学告诉它规律),以及需要移动哪些元素,由于官方确实讲的比较清晰因此直接截图了:

注释:在下面方法中提到的关键等式

还是得多动手多换角度思考啊!学会用数学!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/399978.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

入职字节外包才一个月,我就离职了

有一种打工人的羡慕,叫做“大厂”。 真是年少不知大厂香,错把青春插稻秧。 但是,在深圳有一群比大厂员工更庞大的群体,他们顶着大厂的“名”,做着大厂的工作,还可以享受大厂的伙食,却没有大厂…

惠尔顿 网络安全审计系统 任意文件读取漏洞复现

0x01 产品简介 惠尔顿网络安全审计产品致力于满足军工四证、军工保密室建设、国家涉密网络建设的审计要求,规范网络行为,满足国家的规范;支持1-3线路的internet接入、1-3对网桥;含强大的上网行为管理、审计、监控模块&#xff1b…

猫毛过敏不能养猫了吗?除猫毛好的宠物空气净化器品牌有哪些?

让我们来探讨一下如何让容易过敏的家庭成员和猫咪更好地相处。很多人喜欢猫咪,但与它们相处一段时间后,可能会出现鼻塞、喷嚏和眼泪不断的过敏症状。那么,为什么会过敏呢?这是因为猫的唾液中含有Fel d1蛋白质,当它们舔…

回显服务器的制作方法

文章目录 客户端和服务器TCP和UDP的特点UDP socket api的使用DatagramSocketDatagramPacketInetSocketAddress API 做一个简单的回显服务器UDP版本的回显服务器TCP版本的回显服务器 客户端和服务器 在网络中,主动发起通信的一方是客户端,被动接受的这一方…

SpringBoot+Vue+MySQL:图书管理系统的技术革新

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

怀孕了要把猫送走吗?推荐一款吸猫毛神器—宠物空气净化器

相信大部分家庭都会遇到这样一个二选一的难题:怀孕了还能养猫吗?还是要把猫送走? 许多人担心在孕期与宠物接触可能会导致健康问题,主要是因为弓形虫的存在。然而,实际上感染弓形虫并不容易。如果你真的很担心&#xf…

绘图神器VisIt初步使用

文章目录 安装绘图图像属性 VisIt是一款用于可视化科学数据的开源软件,适用于大型数据集,并提供了丰富的可视化和分析功能。 安装 首先下载VisIt,然后下载一些示例以及测试数据,地址在github上。 下载之后安装,有两…

基于Python的热点分析预警系统

项目:基于Python的热点分析预警系统 摘 要 基于网络爬虫的数据可视化服务系统是一种能自动从网络上收集信息的工具,可根据用户的需求定向采集特定数据信息的工具,本项目通过研究爬取微博网来实现微博热点分析数据信息可视化系统功能。对于采…

二叉搜索树(二叉排序树、二叉查找树)

二叉搜索树(二叉排序树、二叉查找树) 一、定义二、操作(一)中序遍历(二)查找(三)插入(四)删除 三、二叉搜索树的应用四、二叉搜索树操作的性能分析五、总结 一…

CCF-B类SGP‘24 4月10日截稿!速速行动!

会议之眼 快讯 第22届SGP(Eurographics Symposium on Geometry Processing)即欧洲图形学几何处理专题讨论会将于 2024 年 6月24 -日至26日在美国麻省理工学院举行!SGP是传播几何处理新研究想法和尖端成果的首要学术会议。作为该领域的重要学术盛事,SGP会…

模型转换案例学习:等效替换不支持算子

文章介绍 Qualcomm Neural Processing SDK (以下简称SNPE)支持Caffe、ONNX、PyTorch和TensorFlow等不同ML框架的算子。对于某些特定的不支持的算子,我们介绍一种算子等效替换的方法来完成模型转换。本案例来源于https://github.com/quic/qidk…

从零开始手写mmo游戏从框架到爆炸(十六)— 客户端指定回调路由与登录

导航:从零开始手写mmo游戏从框架到爆炸(零)—— 导航-CSDN博客 我们这次来把注册、登录、选择英雄,进入主页-选择地图的功能完善。 在这之前,我们还要解决一个问题,就是服务端往客户端发消息的路由问题…

CSS 不同颜色的小圆角方块组成的旋转加载动画

<template><!-- 创建一个装载自定义旋转加载动画的容器 --><view class="spinner"><!-- 定义外部包裹容器,用于实现整体旋转动画 --><view class="outer"><!-- 定义四个内部小方块以形成十字形结构 --><view clas…

vtk.js加载dicom,获取世界点的坐标、两点之间的距离

通过点击vtk的renderWindow&#xff0c;获取坐标点。 获取点的坐标有vtkCellPicker和vtkPointPicker两个方法&#xff0c;区别在于vtkCellPicker可以区分是否点击在模型上&#xff0c;推荐使用vtkCellPicker。 获取两点之间距离使用vtkMath的方法&#xff0c;vtkMath.distance…

阿里云k8s容器部署consul集群的高可用方案

一、背景 原本consul集群是由三个server节点搭建的&#xff0c;购买的是三个ecs服务器&#xff0c; java服务在注册到consul的时候&#xff0c;随便选择其中一个节点。 从上图可以看出&#xff0c; consul-01有28个服务注册&#xff0c;而consul-02有94个服务&#xff0c;co…

一凸包----------12,分而治之(2)

在上节中&#xff0c;两部分子凸包有重合的部分&#xff0c;不简洁。这一节是沿着某个方向&#xff0c;子凸包不重叠&#xff0c;如下图 根据以前的方法&#xff0c;很可能认为是两个子凸包上顶点与上顶点相连&#xff0c;下顶点与下顶点相连&#xff0c;形成两条支撑线&#…

算法沉淀——二叉树中的深搜(leetcode真题剖析)

算法沉淀——二叉树中的深搜 01.计算布尔二叉树的值02.求根节点到叶节点数字之和03.二叉树剪枝04.验证二叉搜索树05.二叉搜索树中第K小的元素06.二叉树的所有路径 二叉树的深度优先搜索是一种遍历二叉树的方法&#xff0c;它通过深度递归的方式探索树的结构。有两种主要形式&am…

ubuntu 22.04 图文安装

ubuntu 22.04.3 live server图文安装 一、在Vmware里安装ubuntu 22.04.3 live server操作系统 选择第一个选项开始安装 选择English语言 选择中间选项不更新安装&#xff0c;这是因为后续通过更换源之后再更新会比较快 键盘设计继续选择英文&#xff0c;可以通过语言选择…

【微服务生态】Dubbo

文章目录 一、概述二、Dubbo环境搭建-docker版三、Dubbo配置四、高可用4.1 zookeeper宕机与dubbo直连4.2 负载均衡 五、服务限流、服务降级、服务容错六、Dubbo 对比 OpenFeign 一、概述 Dubbo 是一款高性能、轻量级的开源Java RPC框架&#xff0c;它提供了三大核心能力&#…

zabbix5.0利用percona监控MySQL

具体来说包括: Percona Monitoring Plugins 这是一组用于收集MySQL实例各种性能指标和状态的插件脚本,包括: mysqld_stats.pl - 收集服务器状态计数器mysqld_statement_replay.pl - 进行负载模拟测试pt-status - 收集InnoDB资源使用情况等 Percona Templates 基于这些插件收集…