Leecode热题100-48.旋转图像
给定一个 n × 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].length1 <= n <= 20-1000 <= matrix[i][j] <= 1000
我先用一个比较简单的使用一个辅助矩阵的解一下(这个虽然也能过也超过100%的人但是面试过不去,慎用)
class Solution {public void rotate(int[][] matrix) {int len = matrix.length;if(len == 1) return;/*这个解法的空间复杂度是O(N^2)int[][] copy = new int[len][len];for(int i = 0; i < len; i++) {for(int j = 0; j < len; j++) {copy[j][len - 1 - i] = matrix[i][j];}}for(int i = 0; i < len; i++) {for(int j = 0; j < len; j++) {matrix[i][j] = copy[i][j];}}*///翻转代替旋转//matrix[row][col] 水平轴翻转得到matrix[n−row−1][col]//对于主对角线翻转而言,我们只需要枚举对角线左侧的元素,和右侧的元素进行交换,即//主对角线翻转,即Matrix[row][col]变成matrix[col][row]//将它们联立即可得到:matrix[row][col]水平轴翻转matrix[n−row−1][col]//主对角线翻转得到matrix[col][n−row−1]for(int i = 0 ; i < len; i++) {for(int j = 0; j < len; j++) {if(i < len - 1 - i) {swap(matrix, i, j, len - 1 - i, j);}}}for(int i = 0; i < len; i++) {for(int j = 0; j < len; j++) {if(i < j) {swap(matrix, i, j, j, i);}}}}public void swap(int[][] matrix, int i1, int j1, int i2, int j2) {int temp = matrix[i1][j1];matrix[i1][j1] = matrix[i2][j2];matrix[i2][j2] = temp;}
}
本题的正确解法,这个是独家解法,百分比天下第一的解
class Solution {/**解题大概思路是从外到内一圈一圈进行旋转,刚开始的时候左上和右下点分别是(0,0),(n-1,n-1)针对于某一圈来说,我们把这些点分为几类,四个顶点作为第0种节点,然后左上角右移i,右上角下移i,右下角左移i,左下角上移i作为第i种节点每种节点各有四个,i的变化范围从0到当前圈的长度-1,这个长度通过左上角的顶点(tr,tc)和右下角的点(dr,dc)计算得到对于第i种节点,这四个节点分别是(tr,tc+i) (tr+i, dc) (dr,dc-i) (dr-i,tc) */public void rotate(int[][] matrix) {/**首先确认第一个圈的左上角*/int tr = 0, tc = 0;/**确人第一个圈的右下角 */int dr = matrix.length - 1, dc = matrix.length - 1;/**每次tr,tc变为tr+1,tc+1作为下个圈的左上角 ,dr,dc变为dr-1, dc -1 作为右下角tr相对于dr每次会变化2,如果tr>dr才是正方形,不然的话没有任何形状*/while(tr < dr) {rotateCurCircle(matrix, tr++, tc ++, dr --, dc --);}}/***在matrix上90度旋转以(tr,tc)作为左上角和以(dr,dc)作为右下角的正方形*/public void rotateCurCircle(int[][] matrix, int tr, int tc, int dr, int dc) {/**正方形的边长 */int sideLen = dr - tr + 1;/**对于这样一个正方形,我们有边长-1种点 */for(int i = 0; i < sideLen - 1; i++) {/**下面要进行的是四个点的互换工作,也就是旋转90度,先记录一下第四个点的值 *//**四个点分别旋转90度,先记录第四个点到temp */int temp = matrix[dr-i][tc];/**第三个点的值赋值给第四个点 */matrix[dr-i][tc] = matrix[dr][dc-i];/**第二个点的值赋值给第三个点 */matrix[dr][dc-i] = matrix[tr+i][dc];/**第一个点的值赋值给第二个点 */matrix[tr+i][dc] = matrix[tr][tc+i];/**temp(原来保存的第四个点的值)赋值给第一个点 */matrix[tr][tc+i] = temp;}}
}

相关文章:
Leecode热题100-48.旋转图像
给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出…...
重学SpringBoot3-集成Redis(二)之注解驱动
更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(二)之注解驱动 1. 为什么选择 Redis 作为缓存?2. 如何在 Spring Boot 中启用 Redis 缓存?2.1 …...
【React】入门Day04 —— 项目搭建及登录与表单校验、token 管理、路由鉴权实现
项目搭建 创建项目 # 使用npx创建项目 npx create-react-app my-react-app # 进入项目目录 cd my-react-app # 创建项目目录结构 mkdir -p src/{apis,assets,components,pages,store,utils} touch src/{App.js,index.css,index.js} 使用npx create-react-app创建项目࿰…...
CMake 属性之目录属性
【写在前面】 CMake 的目录属性是指在特定目录(及其子目录)范围内有效的设置。 这些属性不同于全局变量或目标(Target)属性,它们提供了一种机制,允许开发者为项目中的不同部分定义不同的构建行为。 通过目录…...
ChatGPT:引领人工智能新潮流!
一、ChatGPT 是什么? 1. ChatGPT 的强大功能和广泛应用。 ChatGPT 作为一款先进的 AI 语言模型,拥有众多强大功能。它可以进行文本生成、文本分类、情感分析、机器翻译等多种自然语言处理任务。同时,ChatGPT 还能进行对话式交互,…...
【银河麒麟高级服务器操作系统】安全配置基线相关分析全过程及解决方案
了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:https://product.kylinos.cn 开发者专区:https://developer.kylinos.cn 文档中心:https://documentkylinos.cn 服务器环境以及配置 【机型】物理机或虚机 【…...
用Python实现图片转ASCII艺术:图像处理与字符艺术的完美结合
解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 ASCII艺术是一种通过字符来表现图像的艺术形式,最早用于早期计算机显示器,它仅支持字符显示。如今,尽管图像分辨率和显示技术得到了极大的提升,ASCII艺术作为一种复古而别具一格的图像表现形式,仍然受到许多…...
大数据-162 Apache Kylin 全量增量Cube的构建 Segment 超详细记录 多图
点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…...
Redis-缓存过期淘汰策略
缓存淘汰策略 生产上redis内存设置为多少 设置为最大内存的 3/4 redis 会占用物理机多少内存 默认大小是 0,64 位系统下表示不限制内存大小,32位系统表示 3G 如何设置修改redis内存大小 config get maxmemory 查看修改方式 配置文件 单位是字节 2.…...
如何设置LED电子显示屏的屏幕参数?
LED电子显示屏因其高亮度、低能耗和长寿命等优点,在广告、信息显示等领域得到了广泛应用。正确设置屏幕参数对于确保显示屏的最佳性能至关重要。以下是LED电子显示屏设置屏幕参数的步骤: 1. 确定屏幕参数 在开始设置之前,需要了解显示屏的基本…...
Spring Boot Starter Parent介绍
引言 spring-boot-starter-parent 是一个特殊的项目,为基于 Spring Boot 的应用程序提供默认配置和默认依赖。 在本 Spring Boot 教程中,我们将深入了解所有 Spring Boot 项目内部使用的 spring-boot-starter-parent 依赖项。我们将探讨此依赖项所提供…...
【含开题报告+文档+PPT+源码】基于SpringBoot乡村助农益农平台的设计与实现
开题报告 近年来,随着社会经济的快速发展和人民生活水平的提高,人们对优质农产品的需求越来越高。然而,传统的农产品销售管理模式存在一些问题。首先,农产品供应链信息不透明,导致生产者难以了解市场需求和价格变动趋…...
数据中心运维挑战:性能监控的困境与智能化解决方案的探寻
随着数字化进程的加速,数据中心已成为企业信息架构的核心支撑,其运维管理的复杂度和重要性也随之提升。运维团队需应对设备老化、资源分配失衡、性能波动等多重难题,以确保数据中心持续高效运行。 其中,性能监控作为运维管理的关键…...
基于SSM的民宿管理系统【附源码】
基于SSM的民宿管理系统(源码L文说明文档) 目录 4 系统设计 4.1 系统概要设计 4.2 系统功能结构设计 4.3 数据库设计 4.3.1 数据库E-R图设计 4.3.2 数据库表结构设计 5 系统实现 5.1用户信息管理 5.2 房东信息管理…...
显卡 3090 vs v100
1.3090 Date: 2020 AmperePielines/ Cuda cores: 10496 2.V100 Date: 2018 VoltaPielines/ Cuda cores: 5129 3.结构 & Core比较: v100优点: v100功耗小v100较快的双精度(fp64)和混合精度(fp16fp32)pcie版的NVLink与2080ti完全一致 v100缺点: 不支持整数格式计算&…...
怎么在单片机裸机程序中移植EasyLogger?
1、介绍 EasyLogger 是一款超轻量级、高性能的C日志库,非常适合对资源敏感的软件项目。例如:IoT产品、可穿戴设备、智能家居等等。相比log4c、zlog这些知名的C日志库,EasyLogger的功能更加简单,提供给用户的接口更少,但…...
C/C++解析文件名和目录路径
文章目录 主要函数使用注意事项示例程序总结 #include <libgen.h> 是一个 C/C 语言的头文件,主要用于字符串处理,特别是在处理文件路径时。它提供了一些函数来帮助你解析文件名和目录路径。 主要函数 以下是 libgen.h 中一些常见的函数ÿ…...
Git 基本命令行操作
Git是一个开源的分布式版本控制系统,用于管理源代码和文档的版本。以下是Git的基本命令行操作: 一、配置 安装完成后,需要配置Git的用户名和邮箱,以便在提交记录时记录操作者的信息。 配置全局用户名:git config --g…...
【Rust练习】17.泛型
练习题来自:https://practice-zh.course.rs/generics-traits/generics.html 函数 1 // 填空 struct A; // 具体的类型 A. struct S(A); // 具体的类型 S. struct SGen<T>(T); // 泛型 SGen.fn reg_fn(_s: S) {}fn gen_spec_t(_s: SGen<A&…...
java脚手架系列4--测试用例、拦截器
异常处理、拦截器、数据库连接 1 测试用例 单元测试是一个老生常谈的问题,无论是后端对自己的代码质量把的第一道关也好,也是对测试减缓压力。这里就不过多讲述测试用例的重要性,但是有2个框架我们必须了解一下。 1.1 JUnit和mockito 我们…...
告别云台乱晃!手把手教你用Arduino+SG90舵机实现‘鸡头稳定’效果(附PID模拟器使用心得)
从鸡头稳定到智能云台:ArduinoPID算法实战指南 你是否注意过鸡在行走时头部能保持惊人的稳定?这种被称为"鸡头稳定"的生物现象,启发了工程师们设计出能自动补偿晃动的智能云台系统。本文将带你用Arduino、SG90舵机和MPU6050传感器&…...
终极免费macOS应用清理工具:让你的Mac告别数字垃圾
终极免费macOS应用清理工具:让你的Mac告别数字垃圾 【免费下载链接】Pearcleaner A free, source-available and fair-code licensed mac app cleaner 项目地址: https://gitcode.com/gh_mirrors/pe/Pearcleaner 你是否曾经遇到过这样的困扰:明明…...
Frenet Corridor Planner:自动驾驶路径规划的核心技术解析
1. Frenet Corridor Planner:自动驾驶路径规划的核心突破在自动驾驶技术栈中,路径规划模块承担着将决策指令转化为可执行轨迹的关键角色。面对城市道路中突然出现的占道车辆或行人,传统基于固定路径的规划方法往往显得力不从心。Frenet Corri…...
TVA智能体范式的工业视觉革命(10)
重磅预告:本专栏将独家连载系列丛书《智能体视觉技术与应用》部分精华内容,该书是世界首套系统阐述“因式智能体”视觉理论与实践的专著,特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。Bohan先生师从美国三院院士、“…...
【智能体核心功能解析与落地实践指南】
智能体核心功能解析与落地实践指南 引言:智能体为何成为技术焦点 在人工智能技术飞速发展的今天,智能体(Agent)已经从学术概念走向产业应用的核心。无论是个人助手、企业自动化流程,还是复杂的决策支持系统,…...
从原理图到PCB的桥梁:手把手教你用Cadence导出STM32项目的网表与BOM清单
从原理图到PCB的桥梁:手把手教你用Cadence导出STM32项目的网表与BOM清单 在电子设计自动化(EDA)流程中,从原理图设计到PCB布局的过渡阶段往往是最容易被忽视却又至关重要的环节。许多工程师在完成精美的原理图后,常常因…...
【国家级社科基金申报利器】:NotebookLM自动生成理论框架图+文献缺口分析,附可验证API调用日志
更多请点击: https://codechina.net 第一章:NotebookLM社会科学研究的范式变革 传统社会科学研究长期依赖人工编码、文献综述与小样本质性分析,知识整合周期长、主观性强、可复现性低。NotebookLM 的引入正系统性重构这一范式——它并非简单…...
告别手动标注!R语言ggplot2+ggannotate高效绘制组间差异柱状图保姆级教程
R语言科研绘图革命:ggplot2ggannotate自动化差异标注全攻略 科研图表的美观程度直接影响论文的第一印象,而统计显著性标注更是数据可视化的灵魂所在。传统手动添加p值和星号的方式不仅效率低下,还容易出错——标注位置偏移、字体大小不一、连…...
终极罗技鼠标宏指南:3步实现PUBG完美压枪
终极罗技鼠标宏指南:3步实现PUBG完美压枪 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 还在为《绝地求生》中难以控制的武器后坐力…...
开发者必备:极简CLI工具高效管理个人代码片段库
1. 项目概述:一个面向开发者的代码片段管理工具最近在整理自己的开发环境,发现一个挺普遍的问题:那些临时写出来、解决了某个具体问题、但又不够格放进正式项目库的代码片段,到底该放哪儿?它们就像散落在硬盘各处的“知…...
