旋转图像

news2024/12/24 8:32:55

旋转图像

思路:

第一意识是找一个数学规律,一个公式可以找到对应的位置。

唉 想不出 没啥思路 看题解了。

一看就懂了  规律就是。。。。。。:原来第 行第 列的元素 在旋转后  会在第 行倒数第i列。

这种题目做少了,多做几个矩阵的总结一下规律就懂了。

法一:这是利用辅助矩阵的方法。

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int n = matrix.size();
        // C++ 这里的 = 拷贝是值拷贝,会得到一个新的数组
        auto matrix_new = matrix;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {//翻转后矩阵的[i][j]是之前的[n-1-j][i]
                matrix_new[i][j]=matrix[n-1-j][i];
            }
        }
        matrix=matrix_new;//再来一次值拷贝
    }
};

法二:不使用辅助数组,原地进行操作,故需要考虑覆盖问题。

为什么要这么想呢,可以从n=2,3看看,可以发现旋转都是很有规律的!!!

法二是利用一个关键公式进行推导:

  matrix_new[j][n - i - 1] = matrix[i][j];

这个公式的意思是,原来[i][j]位置的元素 要旋转到[j][n-i-1]

这个时候[j][n-i-1]就要被覆盖了,我们继续看看这个位置的值旋转后要去哪。

继续代入关键公式,即令i=j,j=n-i-1  我们可以得到[j][n-i-1] 要旋转到[n-i-1][n-j-1]的位置、

我们继续看[n-i-1][n-j-1]要旋转到哪里: 令i=n-i-1,j=n-j-1,我们可以得到[n-i-1][n-j-1]要旋转到

[n-j-1][i]的位置。继续看 ,同理,[n-j-1][i]要旋转到[i][j]

可以大声喊我艹了。我们惊奇的发现闭环了,也就是[i][j]旋转到[j][n-i-1],[j][n-i-1]旋转到[n-i-1][n-j-1],[n-i-1][n-j-1]旋转到[n-j-1][i],[n-j-1][i]又旋转到[i][j],形成了闭环!!

这个时候,我们每次遍历处理四个元素就可以了,处理这四个元素的时候,存一下[i][j],即temp=[i][j],就可以对后续都进行原地赋值操作。即以下五行代码:

temp=[i][j];

[i][j]=[n-j-1][i];

[n-j-1][i]=[n-i-1][n-j-1];

[n-i-1][n-j-1]=[j][n-i-1];

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

每一次处理四个元素,总共有n*n个元素。        

然后剩下的问题是如何确定遍历的范围:

  • 因为每次遍历都是操作4个点,显然我们只需遍历n*n/4个格子即可.
  • 直觉上n*n/4可以等于 (n/2) * (n/2) (即0 <= i < n/2 ,0 <= j < (n/2)),
  • 但也可以等于n * (n/4),究竟是哪种呢?
  • 可以自己模拟一下n=2  n=3就明白了。肯定是前者。
  • n为偶数的时候是四等分:
  • n为奇数时:
  • 综上,不管n是奇数还是偶数,遍历的范围都可以表示为0 <= i < n/2 ,0 <= j < ( n+1 /2)

代码:

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int n=matrix.size();
        for(int i=0;i<n/2;i++)
        {
            for(int j=0;j<(n+1)/2;j++)
            {
                int temp=matrix[i][j];
                matrix[i][j]=matrix[n-j-1][i];
                matrix[n-j-1][i]=matrix[n-i-1][n-j-1];
                matrix[n-i-1][n-j-1]=matrix[j][n-i-1];
                matrix[j][n-i-1]=temp;
            }
        }
    }
};

法三:一些巧妙的方法:用翻转代替旋转

用两次翻转代替旋转:

为什么呢?

我们也分别列出沿水平翻转和沿主对角线翻转的公式:

沿水平翻转:matrix_new[n-i-1][j]=matrix[i][j]

沿对角线翻转:matrix_new[j][i]=matrix[i][j]

这两个联立,可以得到。可以得到matrix_new[j][n-i-1]=matrix[i][j] 而这个就是之前说到的关键公式。所以两次翻转就等于将图像顺时针旋转 90 度。

而这种翻转,直接用swap就好了。

代码:

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int n=matrix.size();
        for(int i=0;i<n/2;i++)//水平翻转
        {
            for(int j=0;j<n;j++)
            {
                swap(matrix[i][j],matrix[n-i-1][j]);
            }
        }
        for(int i=0;i<n;i++)//对角线翻转
        {
            for(int j=0;j<i;j++)
            {
                swap(matrix[i][j],matrix[j][i]);
            }
        }
    }
};

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

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

相关文章

正点原子安装buildroot构建根文件系统

1&#xff1a;何为 buildroot&#xff1f; 1.1&#xff1a;buildroot 简介 在《第三篇 系统移植篇》我们最后讲解了如何使用 busybox 构建文件系统&#xff0c;busybox 仅仅 只是帮我们构建好了一些常用的命令和文件&#xff0c;像 lib 库、/etc 目录下的一些文件都需要我们自…

初识Spring、SpringIOC

Spring 一、什么是Spring框架&#xff1f;(重要) ---对Spring的理解 记忆关键字&#xff1a;1.核心思想&#xff08;IOC、AOP&#xff09; 2.作用&#xff08;解耦、简化&#xff09; 3.简单描述框架组成 答&#xff1a;定义&#xff1a;Spring是一个轻量级的控制反转(IoC)和…

SpringBoot中解决文件application.properties中文注释乱码的问题

如图看到中文注释乱码 很影响代码的阅读 原因是字符编码使用了ISO-8859-1 这里演示如何在idea里面把ISO-8859-1改为UTF-8 点击右上角设置 搜索框输入UTF-8 把默认的改成UTF-8就行了 可以看到中文注释正常显示 希望能够点点赞和收藏&#xff01;&#xff01;

猫咪浮毛大作战!希喂、安德迈宠物空气净化器PK,实测数据大公开

宠物空气净化器作为宠物领域的新产品&#xff0c;凭借自身独特的功能受到铲屎官们的喜爱&#xff0c;越来越多的商家关注到这个市场。然而&#xff0c;市面上品牌逐渐增多&#xff0c;质量却参差不齐&#xff0c;一些不良商家以次充好&#xff0c;容易让消费者陷入消费陷阱。因…

PHYS_OPT_MODIFIED

当对原始单元执行物理优化时&#xff0c;PHYS_OPT_MODIFIED 更新单元的属性以反映对单元执行的优化。什么时候&#xff1f; 对同一单元格执行多次优化&#xff0c;PHYS_OPT_MODIFIED值 包含按发生顺序排列的优化列表。 架构支持 所有架构。 适用对象 PHYS_OPT_MODIFIED属性放置…

Linux嵌入式学习——C++学习(2)

一、标识符的作用域和可见性 &#xff08;一&#xff09;作用域 1、全局作用域 在函数外部声明的变量和函数具有全局作用域。这些变量和函数在程序的任何地方都可以被访问。 2.局部作用域 在函数内部、循环体内部或条件语句内部声明的变量具有局部作用域。这些变量只能在其…

<数据集>航拍屋顶识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;3516张 标注数量(xml文件个数)&#xff1a;3516 标注数量(txt文件个数)&#xff1a;3516 标注类别数&#xff1a;1 标注类别名称&#xff1a;[roof] 序号类别名称图片数框数1roof351643938 使用标注工具&#xf…

模具3D打印:成本缩减与产能提升的新引擎

近年来&#xff0c;3D打印技术&#xff0c;特别是在航空航天、汽车制造、生物医疗等前沿领域&#xff0c;已成为复杂结构件研发与生产的关键技术。针对广大制造企业而言&#xff0c;评估金属3D打印技术的经济效能&#xff0c;即其能否有效助力企业成本控制与产能提升&#xff0…

魔众文库系统v7.0.0版本推荐店铺功能,管理菜单逻辑优化

推荐店铺功能&#xff0c;管理菜单逻辑优化 [新功能] RandomImageProvider 逻辑升级重构&#xff0c;支持更丰富的随机图片生成 [新功能] 资源篮订单参数字段 [新功能] 首页推荐店铺功能&#xff0c;需要在后台 文库系统 → 文库店铺 开启推荐 [系统优化] Grid 快捷编辑请求…

Yolo-World初步使用

Yolo v8目前已经支持Yolo-World&#xff0c;整理一下初步使用步骤。 使用步骤 1 先下载Yolo-World的pt文件&#xff0c;下载地址&#xff1a;GitHub - AILab-CVC/YOLO-World: [CVPR 2024] Real-Time Open-Vocabulary Object Detection 官网应该是点这里&#xff08;有个笑脸…

C++入门:C语言到C++的过渡

前言&#xff1a;C——为弥补C缺陷而生的语言 C起源于 1979 年&#xff0c;当时 Bjarne Stroustrup 在贝尔实验室工作&#xff0c;面对复杂软件开发任务&#xff0c;他感到 C 语言在表达能力、可维护性和可扩展性方面存在不足。 1983 年&#xff0c;Bjarne Stroustrup 在 C 语言…

大数据应用型产品设计方法及行业案例介绍(可编辑110页PPT)

引言&#xff1a;随着信息技术的飞速发展&#xff0c;大数据已成为推动各行各业创新与变革的重要力量。大数据应用型产品&#xff0c;作为连接海量数据与实际应用需求的桥梁&#xff0c;其设计方法不仅要求深入理解数据特性&#xff0c;还需精准把握用户需求&#xff0c;以实现…

git:安装 / 设置环境变量 / 使用

一、下载 https://github.com/git-for-windows/git/releases/download/v2.45.1.windows.1/Git-2.45.1-64-bit.exe 下载成功-双击打开 下一步-Next 二、添加环境变量 1、找到git安装地址 win r cmd 回车 where git 设置环境变量 C:\Program Files\Git\cmd\git.exe 此电…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 最大括号深度(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是 春秋招笔试突围 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-D卷的三语言AC题解 💻 ACM金牌🏅️团队| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,…

分布式事务学习整理

一、整体背景 最近在分布式事务领域这块的了解比较少&#xff0c;对自己来说是一个业务盲点&#xff0c;所以想抽空学习以及整理下关于分布式事务的相关知识。 1、分布式事务的发展 总所周知&#xff0c;我们为什么要考虑分布式事务&#xff0c;从一开始发展来说&#xff0c…

vscode源代码管理的传入传出更改视图如何关闭

传入传出更改视图关闭&#xff1a; vscode源代码管理中下面显示的大量传入传出记录&#xff0c;不想显示的话 在设置里搜索 scm.showHistoryGraph 可以关闭。

[Meachines] [Easy] valentine SSL心脏滴血+SSH-RSA解密+trp00f自动化权限提升+Tmux进程劫持权限提升

信息收集 IP AddressOpening Ports10.10.10.79TCP:22,80,443 $ nmap 10.10.10.79 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 5.9p1 Debian 5ubuntu1.10 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 1024 96:4c:51:42:…

以树莓集团的视角:探索AI技术如何重塑数字媒体产业发展

在科技日新月异的今天&#xff0c;AI技术如同一股不可阻挡的潮流&#xff0c;正深刻改变着我们的世界&#xff0c;尤其是数字媒体产业发展。作为数字产业生态链的杰出建设者&#xff0c;树莓集团始终站在时代前沿&#xff0c;积极探索AI技术如何为数字媒体产业注入新活力。 在树…

(ICCV-2023)使用 Transformer 的可扩展扩散模型

使用 Transformer 的可扩展扩散模型 Paper Title:Scalable Diffusion Models with Transformers Paper是UC Berkeley发表在ICCV 2023的工作 paper地址 code地址 图 1&#xff1a;具有 transformer 主干的扩散模型实现了最先进的图像质量。我们展示了在 ImageNet 上以 512$\time…

初学51单片机1602液晶时序图实例分析

上篇博文笔者分享了关于液晶1602基本的工作流程&#xff0c;本篇主要是通过逻辑分析仪来看一下程序使能的电平时序&#xff0c;是否符合产品文档给出 的时序逻辑。 先看一下1602的时序图 认识下时序图中各个标识的含义&#xff1a; Tc信号周期&#xff08;E Cycle Time&#x…