力扣第四十八题——旋转图像

news2024/9/19 10:46:33

内容介绍

给定一个 × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

示例 1:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]

示例 2:

输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]

提示:

  • n == matrix.length == matrix[i].length
  • 1 <= n <= 20
  • -1000 <= matrix[i][j] <= 1000

完整代码

 void rotate(int** matrix, int matrixSize, int* matrixColSize) {
    int matrix_new[matrixSize][matrixSize];
    for (int i = 0; i < matrixSize; i++) {
        for (int j = 0; j < matrixSize; j++) {
            matrix_new[i][j] = matrix[i][j];
        }
    }
    for (int i = 0; i < matrixSize; ++i) {
        for (int j = 0; j < matrixSize; ++j) {
            matrix[j][matrixSize - i - 1] = matrix_new[i][j];
        }
    }
}

思路详解

这段代码实现了将一个二维矩阵顺时针旋转90度的功能。以下是详细步骤和思路:

1. 创建新矩阵
int matrix_new[matrixSize][matrixSize];
  • 首先定义一个新的二维数组matrix_new,其大小与输入矩阵matrix相同。这个新矩阵用于暂时存储原矩阵的值,以避免在旋转过程中覆盖原数据。
2. 复制原矩阵到新矩阵
for (int i = 0; i < matrixSize; i++) {
    for (int j = 0; j < matrixSize; j++) {
        matrix_new[i][j] = matrix[i][j];
    }
}
  • 通过两层嵌套循环,将原矩阵matrix中的每个元素复制到新矩阵matrix_new中对应的索引位置。这一步确保了在旋转操作过程中,原矩阵的数据不会丢失。
3. 旋转矩阵
for (int i = 0; i < matrixSize; ++i) {
    for (int j = 0; j < matrixSize; ++j) {
        matrix[j][matrixSize - i - 1] = matrix_new[i][j];
    }
}
  • 再次使用两层嵌套循环来执行旋转操作。对于新矩阵matrix_new中的每个元素matrix_new[i][j],将其放置到原矩阵matrixmatrix[j][matrixSize - i - 1]位置。
  • 这里,matrix[j][matrixSize - i - 1]的计算是基于以下观察:
    • 原矩阵中的行i将变成旋转后矩阵的列j
    • 原矩阵中的列j将变成旋转后矩阵的行matrixSize - i - 1。这是因为旋转90度后,原矩阵的最后一列变成了新矩阵的第一行,第二列变成了第二行,以此类推。
4. 完成旋转
  • 经过上述步骤后,原矩阵matrix中的元素已经被顺时针旋转了90度,无需返回值,因为旋转是在原地进行,直接修改了输入矩阵。
代码亮点
  • 原地操作:该算法直接在输入矩阵上进行操作,节省了额外的空间。
  • 直观的旋转逻辑:通过简单的索引变换,实现了矩阵的旋转,易于理解和实现。
注意事项
  • 代码中使用了固定大小的数组matrix_new,这在C语言中是合法的,但限制了函数的可重用性。如果矩阵大小在编译时未知,应使用动态内存分配。
  • 该算法假定输入矩阵是正方形的,即行数和列数相等。如果矩阵不是正方形,代码需要相应调整。

知识点精炼

  1. 矩阵复制

    • 使用嵌套循环将原矩阵的元素复制到一个新矩阵中,以保持原始数据。
  2. 索引变换

    • 利用索引变换公式matrix[j][matrixSize - i - 1]将新矩阵的元素放置到原矩阵的旋转位置。
  3. 原地操作

    • 直接在原矩阵上进行旋转操作,无需额外的存储空间。
  4. 嵌套循环

    • 使用两层嵌套循环遍历矩阵的行和列。
  5. 数组初始化

    • 在栈上静态分配一个二维数组matrix_new用于暂存数据。
  6. 矩阵性质

    • 理解矩阵旋转90度后的行与列的对应关系。
  7. 边界条件

    • 在索引变换中,确保访问矩阵的合法位置,避免越界。
  8. 空间复杂度

    • 算法的空间复杂度为O(n^2),其中n是矩阵的行数或列数。
  9. 时间复杂度

    • 算法的时间复杂度为O(n^2),因为每个元素都需要被访问和赋值一次。
  10. 算法通用性

    • 算法仅适用于正方形矩阵,对于非正方形矩阵需要调整。

 应用场景

图像处理

  • 图像旋转:在图像编辑软件中,用户经常需要旋转图片。矩阵旋转算法可以用来实现这一功能,将图像像素按照一定角度旋转。
  • 视频处理:视频帧也可以视为矩阵,旋转算法可用于视频编辑中的帧旋转。

2. 计算机图形学

  • 物体旋转:在3D图形渲染中,物体在空间中的旋转可以通过矩阵旋转来实现。
  • 视角变换:在图形学中,通过旋转矩阵来改变视角,实现从不同角度观察3D模型。

3. 机器人学和自动化

  • 路径规划:在机器人导航中,矩阵旋转算法可以帮助调整坐标系,以便进行路径规划和避障。
  • 传感器数据处理:某些传感器(如激光雷达)的数据可以表示为矩阵形式,旋转算法有助于处理这些数据。

4. 机器学习和数据分析

  • 特征变换:在机器学习中,数据预处理可能涉及矩阵旋转,以改善模型的性能或适应特定算法的要求。
  • 降维:在数据降维技术中,如主成分分析(PCA),矩阵旋转可以用来找到数据的主要方向。

5. 控制系统

  • 状态空间表示:在控制理论中,系统的状态可以用矩阵表示,旋转算法可以用于状态变换。

6. 物理学和工程学

  • 晶体学:在晶体学中,旋转矩阵用于描述晶体结构的对称性。
  • 结构分析:在工程学中,分析结构的受力情况可能需要将坐标系旋转到某个特定的角度。

7. 日常应用

  • 游戏开发:在游戏开发中,矩阵旋转用于实现角色和物体的旋转动画。
  • 桌面应用:比如电子表格软件中的数据旋转,以不同的视角查看数据。

 

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

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

相关文章

初识c++:stack和queue详解

本节大纲&#xff1a; #stack和queue详解# 1.容器适配器 2.stack的介绍和使用 2.1 stack的介绍 2.2 stack的使用 3.stack的模拟实现 4.queue的介绍和使用 4.1 queue的介绍 4.2 queue的使用 5.queue的模拟实现 6.priority_queue的介绍和使用 6.1 priority_queue的介绍…

什么是docker?小白也能看懂!

&#x1f44f;大家好&#xff01;我是和风coding&#xff0c;希望我的文章能给你带来帮助&#xff01; &#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&#x1f44d;一下博主哦 &#x1f4dd;点击 我的主页 还可以看到和风的其他内容噢&#x…

什么是低代码?低代码开发和零代码开发的区别?

随着数字化时代的到来&#xff0c;企业对于软件开发的需求日益增长。为了提高开发效率和降低成本&#xff0c;越来越多的企业开始关注低代码和零代码平台&#xff0c;为没有编程背景的用户提供了创建应用程序的能力&#xff0c;极大地简化了开发过程。本文将什么是低代码&#…

企业实现数字化转型到底靠什么?5分钟给你讲明白数字化管理!

在数字化浪潮的推动下&#xff0c;企业数字化转型已不再是选择题&#xff0c;而是企业生存和发展的必答题。各种企业纷纷投入资源&#xff0c;采购各类数字化工具&#xff0c;希望能够借此步入数字化的大门。但是&#xff0c;是不是只要全面升级数字化工具&#xff0c;数字化转…

前端Web-JavaScript(上)

要想让网页具备一定的交互效果&#xff0c;具有一定的动作行为&#xff0c;还得通过JavaScript来实现, 这门语言会让我们的页面能够和用户进行交互。 什么是JavaScript JavaScript&#xff08;简称&#xff1a;JS&#xff09; 是一门跨平台、面向对象的脚本语言&#xff0c;是…

软件安全测试内容和方法大揭秘,湖南软件测评公司推荐

在当今信息社会飞速发展的背景下&#xff0c;软件的安全性问题愈发引起人们的重视。软件安全测试&#xff0c;作为提升软件安全性的重要环节&#xff0c;成为众多企业不可或缺的工作之一。 一、软件安全测试的定义与必要性   软件安全测试是指通过对软件进行系统性、全面性的…

gpt分区怎么修复引导?gpt分区修复引导多种方法

随着uefigpt(guid)分区的流行&#xff0c;越来越多的小伙伴经常遇到gpt分区引导丢失的情况&#xff0c;也不知道怎么修复&#xff0c;以前的一些修复工具都只能修复mbr格式下的硬引导&#xff0c;但对于gpt分区引导不是很清楚&#xff0c;gpt分区引导主要是靠分区中的esp分区来…

【IO】使用两个线程完成两个文件的拷贝,分支线程1拷贝前一半,分支线程2拷贝后一半,主线程回收两个分支线程的资源

不是哥们&#xff0c;脑子都烧起来了 1、使用两个线程完成两个文件的拷贝&#xff0c;分支线程1拷贝前一半&#xff0c;分支线程2拷贝后一半&#xff0c;主线程回收两个分支线程的资源 思路&#xff1a; 1、首先创建了求文件长度的函数&#xff0c;在创建函数的时候&#xff…

短剧CPS分销系统框架+资源对接是怎么对接的?

目录 前言&#xff1a; 一、前端uniapp内容有什么&#xff1f; 二、后台管理 三、搭建CPS需要准备什么&#xff1f; 总结&#xff1a; 前言&#xff1a; 目前短剧目前在国内是非常的热门&#xff0c;观看的人群非常的多。如果希望能够通过推广短剧来做副业的话&#xff0c…

初阶数据结构.排序(2.2冒泡排序)

本节大纲&#xff1a; 冒泡排序 1.冒泡排序的思想 2.冒泡排序的特性 3.冒泡排序的实现 1.冒泡排序的思想 冒泡排序&#xff1a;是交换排序的一种&#xff0c;所谓交换&#xff0c;就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置&#xff0c;交换排序…

GenAI 会消灭软件开发人员的工作吗?

软件开发人员、程序员和编码员之间最大的争论之一是&#xff0c;人工智能会抢走我的工作吗&#xff1f;是的&#xff01;答案是肯定的&#xff1b;人工智能会抢走并取代你的工作。人工智能可能不会自己取代你&#xff0c;而是被使用人工智能的人取代。 我向 ChatGPT 提出了同样…

springboot银行客户管理系统代码--论文源码调试讲解

2 相关技术 2.1 MySQL数据库 MySQL是一种具有安全系数、安全系数、混合开发性、高效化等特征的轻量关联数据库智能管理系统。MySQL由C语言和C语言构成&#xff0c;由于C语言和C语言是混合开发的&#xff0c;因此MySQL源码是生命期的。MySQL提供多种多样数据种类&#xff0c;常…

机器学习----神经网络技术详解

机器学习中的神经网络 1. 引言1.1 机器学习的概述1.2 神经网络的重要性和应用领域1.2.1 神经网络的基本概念1.2.2 神经网络的应用领域 2. 神经网络的基础知识2.1 神经网络的定义人工神经网络&#xff08;ANN&#xff09;的基本概念神经元的结构与功能 2.2 神经网络的历史背景早…

27、Python之面向对象:方生方死?对象生命周期是如何管理的

引言 前面关于面向对象的几篇文章&#xff0c;其实主要围绕着面向对象的第一个核心理念——封装&#xff0c;进行面向对象的介绍。从类、对象的静态构成的角度&#xff0c;对类与对象的定义及使用进行介绍。 在进入面向对象另外两个理念的介绍之前&#xff0c;我觉得有必要对…

回调函数和qsort,strcmp函数

有任何不懂的问题可以评论区留言&#xff0c;能力范围内都会一一回答 1&#xff0e;回调函数是什么&#xff1f; 回调函数就是一个通过函数指针调用的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另一个函数&#xff0c;当这个指针被用来调用其所指向…

【LLM大模型】GraphRAG入门学习流程

GraphRAG GraphRAG 是一种基于图的检索增强方法&#xff0c;由微软开发并开源。它通过结合LLM和图机器学习的技术&#xff0c;从非结构化的文本中提取结构化的数据&#xff0c;构建知识图谱&#xff0c;以支持问答、摘要等多种应用场景。GraphRAG的特色在于利用图机器学习算法…

7、springboot3 vue3开发平台-后端-获取用户菜单,构建菜单树列表

1. 获取用户信息并 从用户session 中获取用户信息 Operation(summary "查询当前用户菜单")GetMapping("/getSelfMenu")public Result<List<RouterVO>> getSelfMenu() {UserInfo userLoginInfo (UserInfo) StpUtil.getSession().get("u…

【Docker系列】Docker 中-d 和-it 的区别

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Python开发: 飞机大战 小游戏

玩法 你可以控制飞机左右移动,躲避敌机子弹,同时发射自己的炮弹,将敌人击落! 部署方案: 1、代码如下图; 2、将代码保存到一个python中,比如planeFight.py; 3、在你的电脑中安装python环境,然后使用命令:“py planeFight.py” 运行这个文件即可; 代码 import p…

大模型深度神经网络(Deep Neural Network, DNN)

大模型深度神经网络&#xff08;Deep Neural Network, DNN&#xff09;是一种复杂的机器学习模型&#xff0c;其特点在于包含多个隐藏层&#xff0c;从而赋予模型强大的非线性表达能力和对复杂数据模式的学习能力。以下是对大模型DNN的详细介绍&#xff1a; 一、基本概念 深度…