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

020旋转图像

旋转图像

题目链接:https://leetcode.cn/problems/rotate-image/description/?envType=study-plan-v2&envId=top-100-liked

我的解答:

public void rotate(int[][] matrix) { int n = matrix.length; int temp, pre; int row=0, column, newRow=0, newColumn, tempRow; while(row<n/2){ for(column=row; column<n-1-row; column++){ temp = matrix[row][column]; newRow = column; newColumn = n-1-row; for(int i=0; i<4; i++){ pre = matrix[newRow][newColumn]; matrix[newRow][newColumn] = temp; temp = pre; tempRow = newRow; newRow = newColumn; newColumn = n-1-tempRow; } } row++; } }

分析:代码的时间复杂度为O(n^2),空间复杂度为O(1)。解题思路:从一个起始位置开始循环完成这组位置的交换,每一组只需4次交换,我们将矩阵分层,从外层开始向内层每层只需要n-1个位置(0~n-2列)进行循环交换即可完成这层所有数据的旋转。

看了官方题解后的解答:

//方法一:使用辅助数组 //时间复杂度:O(n^2) //空间复杂度:O(n^2) //经过观察发现,旋转90°后的矩阵,第i行成为了倒数第i列,利用这个规律可以使用辅助数组简单的完成旋转 public void rotate(int[][] matrix) { int n = matrix.length; int[][] matrix_new = new int[n][n]; for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { matrix_new[j][n - i - 1] = matrix[i][j]; } } for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { matrix[i][j] = matrix_new[i][j]; } } } //方法二:原地旋转 //时间复杂度:O(n^2) //空间复杂度:O(1) public void rotate(int[][] matrix) { int n = matrix.length; int temp; for(int i=0; i<n/2; i++){ for(int j=0; j<(n+1)/2; j++){ temp = matrix[i][j]; matrix[i][j] = matrix[n-1-j][i]; matrix[n-1-j][i] = matrix[n-1-i][n-1-j]; matrix[n-1-i][n-1-j] = matrix[j][n-1-i]; matrix[j][n-1-i] = temp; } } } //方法三:用翻转代替旋转 //时间复杂度:O(n^2) //空间复杂度:O(1) public void rotate(int[][] matrix) { int n = matrix.length; int temp; //上下水平翻转 for(int i=0; i<n/2; i++){ for(int j=0; j<n; j++){ temp = matrix[i][j]; matrix[i][j] = matrix[n-1-i][j]; matrix[n-1-i][j] = temp; } } //按主对角线翻转 for(int i=0; i<n; i++){ for(int j=0; j<i; j++){ temp = matrix[i][j]; matrix[i][j] = matrix[j][i]; matrix[j][i] = temp; } } }

分析:

​ 1、方法二的解题思路:结合方法一中发现的规律“旋转90°后的矩阵,第i行成为了倒数第i列”,我们可以得到每组数据(4个)的坐标,然后用一个临时变量temp保存其中一个数据即可完成这组数据的旋转变换,对于整个矩阵,我们只需要以矩阵左上角四分之一的数据为起点完成对应每组数据的旋转交换即可完成整个矩阵的旋转。

​ 2、方法三的解题思路:可从坐标变换公式(能推导出关键等式:matrix[row] [col] = matrix[col] [n-1-row])、几何直观理解、线性代数角度分别进行分析。

总结

  • 本题主要需要经过观察总结出关键等式:matrix[row] [col] = matrix[col] [n-1-row],寻找到能够满足这个等式的方法,或直接根据等式推断出每组数据的坐标然后进行旋转替换,或采用水平翻转+对角线翻转从而实现矩阵90°旋转。方法三的逻辑清晰,且更加通用。
http://www.jsqmd.com/news/772107/

相关文章:

  • 终极Java RPG游戏资源解密工具:5分钟掌握免费跨平台解密技巧
  • Linux驱动开发(1)——系统移植
  • 别再被虚线搞晕了!机械制图剖视图保姆级入门指南(附剖面符号速查表)
  • 从零到一:KoboldAI本地部署与创作引擎深度解析
  • Java-RPG-Maker-MV-Decrypter:终极RPG游戏资源解密工具完全指南
  • 3步解锁AMD Ryzen性能:SMUDebugTool硬件调试实战指南
  • YOLO11涨点优化:边界框回归 | 融合KLD (Kullback-Leibler Divergence) 损失,将边界框建模为高斯分布,有效对抗模糊边界
  • 2205C 贪心
  • py每日spider案例之某33搜帧之请求头参数X-Signature逆向 (难度中等 扣取代码到处关键加密函数即可)
  • 保姆级避坑指南:DolphinScheduler 3.1.8 分布式安装,从环境准备到一键启动的完整流程
  • Hotkey Detective:Windows热键冲突诊断的终极解决方案
  • 缠论分析自动化:3分钟让通达信智能识别中枢和笔段
  • FCDesigner:基于Vue3的多框架低代码表单设计器架构解析与实践应用
  • 把传输目录当成生产防线来设计,谈谈 SAP 三层 landscape 里最容易被低估的一道门
  • Path of Building PoE2词缀系统深度解析:从数据到算法的装备构建革命
  • 终极免费跨平台视频压缩神器CompressO:5分钟学会专业级压缩技巧
  • 全面掌握Botty:如何让暗黑2重制版自动化刷宝变得简单?
  • 别把 Web Dynpro ABAP 授权做成一锅粥,真正该分清的是 S_START、S_DEVELOP、S_WDR_DEV 和 S_WDR_ADM
  • 观察不同模型在Taotoken上的响应速度与token消耗差异
  • 5分钟解决Windows老游戏兼容性问题:DDrawCompat终极指南
  • 4.29 redis在java项目的使用
  • 实测Taotoken多模型路由在高峰时段的响应稳定性表现
  • Kotlin Multiplatform (KMP) 鸿蒙开发整合实战|2026最新方案
  • BitNet b1.58-2B-4T-gguf惊艳案例:实时会议语音转文字+要点摘要双模输出
  • 终极Nintendo Switch游戏安装方案:Awoo Installer如何简化你的游戏管理体验
  • 企业如何利用 taotoken 统一管理多个团队的模型 api 调用与成本
  • M9A:重返未来1999终极自动化助手 - 彻底告别手动刷本的全新方案
  • 速成蓝桥杯之排序(一)
  • 别再白花钱了!FDM打印层纹,我亲测水补土到底有没有用(附尚色喷漆枪使用体验)
  • 5分钟快速解锁Steam游戏:Onekey智能配置工具完全指南