当前位置: 首页 > news >正文

LeetCode 48:三种解法玩转图像旋转(Python,Java解法)

题目LeetCode.48

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

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

Python解法

解法一(赋值到一个新空间)

class Solution: def rotate(self, matrix: List[List[int]]) -> None: n = len(matrix) new_matrix = [[0] * n for _ in range(n)] for i in range(n): for j in range(n): new_matrix[j][n-i-1] = matrix[i][j] matrix[:] = new_matrix

所给二维数组为方形,直接测行数:n = len(matrix),

创建一个等大的数组:使用Python中的推导式,

转换数组(代码核心):new_matrix[j][n-i-1] = matrix[i][j]。

解法二(直接四个元素转换)

class Solution: def rotate(self, matrix: List[List[int]]) -> None: n = len(matrix) for i in range(n // 2): for j in range((n+1) // 2): a, b, c, d = i, j, n - j - 1, n - i - 1 matrix[a][b], matrix[c][a], matrix[d][c], matrix[b][d] = \ matrix[c][a], matrix[d][c], matrix[b][d], matrix[a][b]

本解法比较难理解,可尽量理解

主要在于循环条件的控制如何交换,只遍历左上角一小块

下面以题目为例展示过程

矩阵:

1 2 3 4 5 6 7 8 9

只需要处理左上角 4 个格子:(0,0)、(0,1)、(1,0)、(1,1)

旋转 (0,0)

四元组:(0,0) → (2,0) → (2,2) → (0,2)对应数字:1 → 7 → 9 → 3

旋转后:

3 2 1 4 5 6 9 8 7

旋转 (0,1)

四元组:(0,1) → (1,0) → (2,1) → (1,2)对应数字:2 → 4 → 8 → 6

旋转后:

3 4 1 8 5 2 9 6 7

旋转 (1,0)

已经被上面处理过,不会重复。

旋转 (1,1)

中心元素 5 自己转自己,不变。

最终结果:

7 4 1 8 5 2 9 6 3

解法三(先水平翻,再 对角(\)翻)

class Solution: def rotate(self, matrix: List[List[int]]) -> None: n = len(matrix) for j in range(n//2): matrix[j],matrix[n-j-1]=matrix[n-j-1],matrix[j] for i in range(n): for j in range(i): matrix[i][j],matrix[j][i] = matrix[j][i], matrix[i][j]

Java解法(顺序同Python)

解法一

class Solution { public void rotate(int[][] matrix) { int n = matrix.length; int[][] new_matrix = new int[n][n]; for(int i = 0; i < n; ++i){ for(int j = 0; j < n; ++j){ new_matrix[j][n - i -1] = matrix[i][j]; } } for(int i = 0; i < n; ++i){ for(int j = 0; j < n; ++j){ matrix[i][j] = new_matrix[i][j]; } } } }

解法二

public class Solution { public void rotate(int[][] matrix) { int n = matrix.length; // 只遍历左上角 1/4 区域 for (int i = 0; i < n / 2; i++) { for (int j = 0; j < (n + 1) / 2; j++) { // 暂存左上角的值 int temp = matrix[i][j]; // 1. 左下 → 左上 matrix[i][j] = matrix[n - 1 - j][i]; // 2. 右下 → 左下 matrix[n - 1 - j][i] = matrix[n - 1 - i][n - 1 - j]; // 3. 右上 → 右下 matrix[n - 1 - i][n - 1 - j] = matrix[j][n - 1 - i]; // 4. 暂存值 → 右上 matrix[j][n - 1 - i] = temp; } } } }

解法三

public class Solution { public void rotate(int[][] matrix) { int n = matrix.length; // 1. 水平上下翻转 for (int i = 0; i < n / 2; i++) { for (int j = 0; j < n; j++) { // 交换第 i 行和第 n-1-i 行的 j 列元素 int temp = matrix[i][j]; matrix[i][j] = matrix[n - 1 - i][j]; matrix[n - 1 - i][j] = temp; } } // 2. 主对角线转置 for (int i = 0; i < n; i++) { for (int j = 0; j < i; j++) { // 交换 (i,j) 和 (j,i) int temp = matrix[i][j]; matrix[i][j] = matrix[j][i]; matrix[j][i] = temp; } } } }

总结

本题通过三种解法详细解答了如何去翻转二维数组,分别为赋值,直接转换,翻转三种,每一种解法都很有特色,希望大家能够找到自己合适的方法。

http://www.jsqmd.com/news/617441/

相关文章:

  • OpenClaw云端体验:星图平台Qwen3.5-9B镜像快速验证方案
  • OpenClaw飞书插件怎么安装?新手从下载、配置到跑通全流程详解
  • 如何在Linux上安装哔哩哔哩客户端:终极完整指南
  • 品牌组合的“协同”价值:多品牌共享渠道、技术、声誉的条件
  • 基于JavaScript的跨平台网盘直链解析引擎:构建高性能分布式文件下载解决方案
  • skill整理-接口文档生成
  • xmame(0.106)在imx6q上移植
  • 终极键盘防抖软件指南:彻底解决机械键盘重复输入问题
  • BepInEx实战指南:5步构建Unity游戏模组开发环境
  • 3分钟学会Windows和Office激活:KMS_VL_ALL_AIO一键解决方案
  • 让老旧Mac重获新生:OpenCore Legacy Patcher完整使用指南
  • 八大网盘直链下载助手:免费高速下载的完整终极解决方案
  • 碧蓝航线Alas脚本:让游戏自动化的终极懒人指南 [特殊字符]
  • SpringBoot+MyBatis-Plus 实现用户管理模块 CRUD + 分页 + 条件查询(电商系统实战,代码可直接复制)
  • 百度网盘直链解析工具:让下载速度飞起来的秘密武器
  • Android Camera开发避坑指南:HAL3与MediaCodec整合的那些坑
  • 车辆电耗变化情况
  • 美团打造“视觉语言大一统“:让AI像人类一样看图说话生图聊天
  • Beyond Compare 5密钥生成终极指南:快速解决授权问题的完整教程
  • Xenos技术内幕:Windows DLL注入架构深度解析
  • 芯片设计经理开始研究AI了,“一人团队“真的要来了吗?
  • aibiye的AI工具针对高重复率论文,推出五步降重法。结合深度学习技术重构语句,保留原意的同时提升独特性,让30%的重复率迅速降至合格线。
  • 山东哪家老干烘茶品质好? - 中媒介
  • 2026 企业 AI 知识中枢与智能 BI 部署优选:知识库部署厂商 / 服务商、AI 知识库方案商、Deepseek 部署服务商、BI 私有化 / 本地部署厂商完整盘点 - 品牌2026
  • OpenClaw+Qwen3-14B科研助手:文献自动归档与摘要生成
  • AgentCgroup论文学习:AI Agent为什么需要新的OS资源控制
  • ChatGPT Plus/Pro用户必看:如何突破O1/O3模型文件识别限制与使用次数瓶颈?
  • MySQL超详细安装教程(保姆级)
  • 绍兴Geo优化服务,究竟哪家更值得选?
  • 终极指南:3分钟为Android Studio添加中文界面,告别英文困扰