【LeetCode Hot100】旋转图像|原地旋转 vs 转置+反转,Java实现,图解+代码

news/2025/2/26 9:02:32

💻 [LeetCode Hot100] 旋转图像|原地旋转 vs 转置+反转,Java实现,图解+代码

✏️本文对应题目链接:旋转图像


📌 题目描述

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

示例:

java">输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]
解释:顺时针旋转 90 度后的图像。

🧠 解题思路(图文分解)

❗ 核心难点

如何在O(1)空间复杂度内完成矩阵的原地旋转?


方法一:原地旋转(黄金思路)✨

关键步骤:

  1. 分层旋转:将矩阵分为若干层,逐层旋转
  2. 四元素交换:对于每一层,将四个对应位置的元素进行交换
  3. 终止条件:当层数达到矩阵中心时停止

图解原地旋转

输入矩阵:

matrix = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
]

步骤1:分层

外层:1, 2, 3, 6, 9, 8, 7, 4
内层:5

步骤2:四元素交换

外层:
- (1,3,9,7) → (7,1,3,9)
- (2,6,8,4) → (4,2,6,8)
内层:
- 5 → 5

最终结果:

[
  [7, 4, 1],
  [8, 5, 2],
  [9, 6, 3]
]

🚀 代码实现

java">class Solution {
    public void rotate(int[][] matrix) {
        int n = matrix.length;
        
        // 分层旋转
        for (int layer = 0; layer < n / 2; layer++) {
            int start = layer;
            int end = n - 1 - layer;
            
            for (int i = start; i < end; i++) {
                int offset = i - start;
                int top = matrix[start][i]; // 保存上边元素
                
                // 左 → 上
                matrix[start][i] = matrix[end - offset][start];
                
                // 下 → 左
                matrix[end - offset][start] = matrix[end][end - offset];
                
                // 右 → 下
                matrix[end][end - offset] = matrix[i][end];
                
                // 上 → 右
                matrix[i][end] = top;
            }
        }
    }
}

💡 复杂度分析

  • 时间复杂度:O(n²) → 每个元素被访问一次
  • 空间复杂度:O(1) → 原地操作,仅用常数空间

方法二:转置 + 反转(优化思路)

关键思路:先对矩阵进行转置,再对每一行进行反转。

java">class Solution {
    public void rotate(int[][] matrix) {
        int n = matrix.length;
        
        // 转置矩阵
        for (int i = 0; i < n; i++) {
            for (int j = i; j < n; j++) {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[j][i];
                matrix[j][i] = temp;
            }
        }
        
        // 反转每一行
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n / 2; j++) {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[i][n - 1 - j];
                matrix[i][n - 1 - j] = temp;
            }
        }
    }
}

🌟 总结要点

原地旋转核心思想:通过四元素交换实现分层旋转
转置+反转核心:利用矩阵性质简化操作
适用场景:图像处理、矩阵变换



http://www.niftyadmin.cn/n/5868439.html

相关文章

[杂学笔记]OSI七层模型作用、HTTP协议中的各种方法、HTTP的头部字段、TLS握手、指针与引用的使用场景、零拷贝技术

1.OSI七层模型作用 物理层&#xff1a;负责光电信号的传输&#xff0c;以及将光电信号转化为二进制数据数据链路层&#xff1a;主要负责将收到的二进制数据进一步的封装为数据帧报文。同时因为数据在网络中传递的时候&#xff0c;每一个主机都能够收到报文数据&#xff0c;该层…

安宝特科技 | Vuzix Z100智能眼镜+AugmentOS:重新定义AI可穿戴设备的未来——从操作系统到硬件生态,如何掀起无感智能革命?

一、AugmentOS&#xff1a;AI可穿戴的“操作系统革命” 2025年2月3日&#xff0c;Vuzix与AI人机交互团队Mentra联合推出的AugmentOS&#xff0c;被业内视为智能眼镜领域的“iOS时刻”。这款全球首个专为智能眼镜设计的通用操作系统&#xff0c;通过三大突破重新定义了AI可穿戴…

使用内置命令查看笔记本电池健康状态

如何使用powercfg /batteryreport命令查看笔记本电池健康状态 在Windows系统中&#xff0c;了解笔记本电池的健康状态对于维护电脑性能和预测电池寿命至关重要。Windows 10和Windows 11系统提供了一个内置命令powercfg /batteryreport&#xff0c;可以生成一份详细的电池使用情…

计算机网络:应用层 —— 电子邮件

文章目录 电子邮件的起源与发展电子邮件的组成电子邮件协议邮件发送和接收过程邮件发送协议SMTP协议多用途因特网邮件扩展MIME 电子邮件的信息格式 邮件读取协议邮局协议POP因特网邮件访问协议IMAP 基于万维网的电子邮件 电子邮件&#xff08;E-mail&#xff09;是因特网上最早…

SSL/TLS 协议、SSL证书 和 SSH协议 的区别和联系

下面是 SSL/TLS 协议、SSL证书 和 SSH协议 的区别和联系&#xff0c;包含它们的英文全称和中文全称&#xff1a; 属性SSL/TLS 协议SSL证书SSH 协议英文全称Secure Sockets Layer / Transport Layer SecuritySecure Sockets Layer CertificateSecure Shell Protocol中文全称安全…

UE5 Computer Shader学习笔记

首先这里是绑定.usf文件的路径&#xff0c;并声明是用声明着色器 上面就是对应的usf文件路径&#xff0c;在第一张图进行链接 Shader Frequency 的作用 Shader Frequency 是 Unreal Engine 中用于描述着色器类型和其执行阶段的分类。常见的 Shader Frequency 包括&#xff1a…

Spring 原始注解详解与实战指南

&#x1f4dd; 1. 前言 在 Spring 框架的发展过程中&#xff0c;注解的引入大大简化了配置&#xff0c;提升了开发效率 本文将详细介绍 Spring 最初引入的核心注解&#xff0c;包括 Component、Controller、Service、Repository、Autowired、Qualifier 和 Value 等&#xff0c;…

面试之《react近几个版本的更新要点》

React 16.x 系列 React 16.0 Fiber 架构&#xff1a;引入了全新的 Fiber 协调器&#xff0c;解决了旧版同步渲染长时间阻塞主线程的问题&#xff0c;实现了异步可中断渲染、优先级调度、时间分片等特性&#xff0c;大大提升了大型应用的性能和响应能力。 新的错误边界&#x…