每日一题——旋转图像

news2024/10/7 16:20:55

旋转图像

题目链接

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


方法一:利用辅助数组

通过对示例的观察和分析,我们可以得到这样的结论:

  • 对于原数组的下标为i行元素,顺时针旋转九十度后,都变成了下标为(n-1-i)列元素。如图所示:

  • 对于原数组的下标为j列元素,顺时针旋转九十度后,都变成了下标为(j)行元素。如图所示:

  • 结论:

假设带旋转的元素位置为nums[i][j],那么顺时针旋转九十度后这个元素的位置就应该是nums[j][n-1-i]

这样想清楚后这题似乎就变得十分简单,但是我们应该想到旋转玩一组数据后,有些数据就会被覆盖,如图:

因此,我们可以再新创建一个临时数组来保存这些旋转后的数据,然后再将新数组的数据覆盖到原数组就可以了。

实现代码

void rotate(int** matrix, int matrixSize, int* matrixColSize){
    int n = matrixSize;
	
    //创建临时数组
    int **ret = (int**)malloc(sizeof(int*) * (n));
    for (int i = 0; i < n; i++)
        ret[i] = (int*)malloc(sizeof(int) * n);
	
    //先储存旋转后数组的数据
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            ret[j][n - 1 - i] = matrix[i][j];
	
    //实现覆盖
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            matrix[i][j] = ret[i][j];
	
    //释放临时数组的空间
    free(ret);
}

方法二: 原地旋转

我们先来看2 * 2数组顺时针旋转九十度的情形:

我们可以认为旋转过程是这样的:D->A、C->D、B->C、A->B,应该注意执行完D->A后,数据A就被覆盖了,因此我们需要创建一个临时变量来保存数据A,这样,这个旋转过程就变为了temp=A, D->A、C->D、B->C、temp->B

在这里插入图片描述

我们将数组扩大,那么由上面的推理可以得到,每经过上面的一轮变换,都可以旋转数组的4个元素:

那么如何将整个数组的元素都旋转,我们只需要取数组左上角1/4的元素,并将这些数据作为旋转起点,依次进行旋转即可:

同时经过分析我们也可以得到,一轮旋转的4个元素的下标变化应该是这样的:

最后,我们应该注意区分n为奇数或偶数的情况:

  • 当n为偶数,数组的旋转起始位置(左上角1/4区域)为:

  • 当n为奇数,数组的旋转起始位置(左上角1/4区域)为:

因此,当n为奇数或者偶数时,区域的列数都为n/2当n为偶数时,行数为n/2,n为奇数时,行数为(n+1)/2

实现代码

void rotate(int** matrix, int matrixSize, int* matrixColSize){
    int n = matrixSize;
    
	//确定左上角1/4区域的范围
    int row = n / 2;
    int col = (n + 1) / 2;
    
    //以左上角1/4区域的每个元素为起点,依次进行旋转
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            int temp = matrix[i][j];

            matrix[i][j] = matrix[n-1-j][i];
            matrix[n-1-j][i] = matrix[n-1-i][n-1-j];
            matrix[n-1-i][n-1-j] = matrix[j][n-1-i];
            matrix[j][n-1-i] = temp;
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代理模式 静态代理和动态代理(jdk、cglib)——Java入职第十一天

一、代理模式 一个类代表另一个类去完成扩展功能,在主体类的基础上,新增一个代理类,扩展主体类功能,不影响主体,完成额外功能。比如买车票,可以去代理点买,不用去火车站,主要包括静态代理和动态代理两种模式。 代理类中包含了主体类 二、静态代理 无法根据业务扩展,…

蜜桃星球 | 主理人,轻创业翻身副业,情趣赛道行业陪跑服务

我们为什么能在年纪轻轻的时候赚到钱&#xff1f; 一个重要原因就是&#xff0c;接触互联网后&#xff0c;我们所进入的所有行业&#xff0c;都是轻资产领域。 从流量到运营&#xff0c;所有的行业都是轻资产行业&#xff0c;都是不需要囤货的生意&#xff0c;只需要一根网线…

代替forever下一个部署node的持久化工具---pm2

最近有个后端项目&#xff0c;用的是node&#xff0c;在持久化的时候会挂掉&#xff0c;详细了解到用的是nohup&#xff0c;然后先详细了解了一下nohup nohup是一个Linux命令&#xff0c;用于在系统后台不挂断地运行命令&#xff0c;退出终端不会影响程序的运行1nohup的英文全称…

react学习之路:InputNumber的parser在ts里面报类型错误

错误提示&#xff1a; Type ‘(value: string | undefined) > string’ is not assignable to type ‘(displayValue: string | undefined) > 0 | 2 | 20’. Type ‘string’ is not assignable to type ‘0 | 2 | 20’. 代码示例&#xff1a; <InputNumbermin{0}m…

电视盒子哪款好?数码党私藏网络电视盒子排行榜

电视盒子称得上是家家户户必备了&#xff0c;但是不同品牌和不同产品之间的体验差异较大&#xff0c;让大家在挑选电视盒子时都会纠结电视盒子哪款好&#xff0c;我身为资深数码粉&#xff0c;接下来将给各位分享数码粉心中最值得入手的网络电视盒子排行榜&#xff0c;看看电视…

关于xml中返回string类型代码中用list接收的问题,扫描

1.结论,xml中返回为string的话,在list中只会取出来第一个元素 //根据value查询GetMapping("getTest")public List<HashMap> getTest() {List<HashMap> list dictService.getTest();return list;} <select id"getTest" resultType"jav…

伦敦银交易时间怎么选择?

伦敦银和伦敦金都是全球性的交易品种&#xff0c;一般的现货贵金属交易平台&#xff0c;都可以同时经营这两个品种&#xff0c;而且它们的交易时间是一致的&#xff0c;以香港市场的平台为例&#xff0c;基本上交易时间都会从北京周一的早上7点&#xff0c;延续到周六凌晨5点左…

Shell脚本进阶:提升你的自动化脚本编程技巧

摘要&#xff1a;本文将介绍一些Shell脚本进阶技巧&#xff0c;帮助你提高自动化脚本编程的效率和可靠性。我们将涵盖一些常用的Shell脚本编程技巧&#xff0c;并提供相关的代码示例&#xff0c;以便读者更好地理解和应用这些技巧。 1. 函数的使用 Shell脚本中的函数可以帮助我…

【Day-24慢就是快】代码随想录-二叉树-二叉树的层序遍历

给你一个二叉树&#xff0c;请你返回其按 层序遍历 得到的节点值。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 ———————————————————————————————————————— 借助辅助队列来实现层序遍历。也就是图论中的广…

AI助乡行——点燃乡村振兴新引擎

随着数字化浪潮的袭来&#xff0c;乡村振兴战略的推进离不开数字化、智慧化等现代化治理能力和方式&#xff0c;人工智能等高新技术正不断与农村经济、社会、治理等加速融合。在智慧农业的背景下&#xff0c;我们可以解决一系列困扰农民的问题&#xff0c;包括如何增加经济作物…

vue去掉循环数组中的最后一组的某个样式style/class

vue去掉循环数组中的最后一组的某个样式style/class 需求&#xff1a;要实现这样的排列 现状 发现&#xff0c;最后一个格子并没有跟下面绿色线对齐。 最后发现 是因为 每个格子都给了 margin-right&#xff1a;36px&#xff0c;影响到了最后一个格子 所以要 将最后一个格子的…

安装并使用srs直播

一、安装srs sudo docker run -d -p 1935:1935 -p 1985:1985 -p 8080:8080 --name srs registry.cn-hangzhou.aliyuncs.com/ossrs/srs:v4.0.34二、vue展示 1、引入库 npm install --save flv.js2、导包 import flvjs from "flv.js";3、完整案例 <template><…

Python中的迭代器和生成器介绍

一、迭代器&#xff08;Iterators&#xff09; 迭代器是Python中用于遍历数据集合的一种机制。它是一个实现了迭代协议的对象&#xff0c;可以通过iter()函数来获得迭代器。迭代器需要实现两个方法&#xff1a;__iter__()和__next__()。其中&#xff0c;__iter__()返回迭代器自…

NI RF 无线设计与测试产品 ,你所需要了解的一切

无线设计与测试 随着无线通信的界限不断突破&#xff0c;NI专门针对快速原型验证和生产测试提供了各种软件无线电设备、发生器、分析仪和收发仪。 矢量信号收发仪 VSTRF信号发生器软件无线电 USRP网络分析仪频谱和信号分析仪RF和微波开关功率传感器RF信号调理 矢量信号收发仪…

大数据精准营销怎么满足用户的个性化需求?

近年来在AI和媒体的带动下&#xff0c;大数据分析不断介入&#xff0c;各行各业都开始陆续依仗大数据营销这棵大树&#xff0c;以此来更加高效、便捷、智能、精准的服务于用户。 这就像追求恋人一样&#xff0c;投其所好方能成为眷属。 大数据精准营销的好处&#xff1a; 相…

SOC总线学习记录之ICB(Internal Chip Bus)

蜂鸟E203总线&#xff1a; 采用自定义总线协议 ICB&#xff08;Internal Chip Bus&#xff09;&#xff0c;该总线用于蜂鸟 E203 内核内部使用&#xff0c;同时也可作为 SoC 中的总线使用。 ICB 总线的初衷是为了能够尽可能地结合 AXI 总线和 AHB 总线的优点&#xff0c;兼具高…

如何写出更优雅的CSS代码?

CSS&#xff08;全称Cascading Style Sheets&#xff0c;层叠样式表&#xff09;为开发人员提供声明式的样式语言&#xff0c;是前端必备的技能之一。基于互联网上全面的资料和简单易懂的语法&#xff0c;CSS非常易于学习&#xff0c;但其知识点广泛且分散&#xff0c;很难做到…

阿里云上linux服务器安装tomcat及vuepress2搭建博客部署

一、准备材料 2年前白嫖了试用期的服务器玩了一阵子&#xff0c;到期了&#xff0c;重新购买一个服务器&#xff0c;再次记录一下过程&#xff0c;有需要的可以参考 配置参数&#xff1a;1核2G 贷款1M 阿里云服务器、MobaXterm、jdk1.8、tomcat8.5.78 安装参数&#xff1a…

HP惠普星15青春版/惠普小欧笔记本电脑15s-du1008tx原装出厂Win11系统

适用型号&#xff1a;15s-du1007tx、15s-du1008tx、15s-du1009tx、15s-du1010tx、15s-du1011tx、15s-du1012tx、15s-du1013tx 自带所有驱动、出厂主题壁纸LOGO、Office办公软件、惠普电脑管家等预装程序 所需要工具&#xff1a;32G或以上的U盘 文件格式&#xff1a;ISO 文件大…

JS返回NodeList和HTMLCollection详解

HTML DOM 集合 (Collection) 概述 HTML DOM 集合 (Collection) 是一组 HTML 元素&#xff0c;这些元素可以通过 JavaScript 代码进行访问和操作。HTML DOM 集合通常由一个或多个 HTML 元素组成&#xff0c;并提供了访问和操作这些元素的方法。HTML DOM 集合在 JavaScript 中非常…