LeetCode:Rotate Image
You are given an n x n 2D matrix representing an image.
Rotate the image by 90 degrees (clockwise).
Follow up:
Could you do this in-place?
不使用额外的空间顺时针旋转方阵90度
例如
算法1
先将矩阵转置,然后把转置后的矩阵每一行翻转
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class Solution { public : void rotate(vector<vector< int > > &matrix) { int n = matrix.size(); //转置 for ( int i = 0; i < n; i++) for ( int j = i+1; j < n; j++) swap(matrix[i][j] , matrix[j][i]); //每一行翻转 for ( int i = 0; i < n; i++) for ( int j = 0; j < (n>>1); j++) swap(matrix[i][j], matrix[i][n-j-1]); } }; |
算法2
可以见矩阵看成多个环组成,如下4*4的矩阵包括两个环,第一个环为1,2,3,4,8,12,16,15,14,13,9,5,1,第二个环为6,7,11,10。
旋转一个矩阵,相当于把每一个环都旋转。如何旋转一个环呢?以最外层的环举例: 本文地址
我们把环分成3组:{1,4,16,13},{2,8,15,9},{3,12,14,5},每一组中:旋转后相当于把原来的数字移动到同组中下一个数字的位置
对于一个n*n的矩阵可以分成n/2(向上取整)个环来旋转;对于边长为len的环,可以分成len-1组来旋转。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class Solution { public : void rotate(vector<vector< int > > &matrix) { int n = matrix.size(); if (n == 0) return ; for ( int i = 0, len = n; i < n/2; i++, len -= 2) { //n/2 为旋转的圈数,len为第i圈中正方形的边长 int m = len - 1; for ( int j = 0; j < m; j++) { int tmp = matrix[i][i+j]; matrix[i][i+j] = matrix[i+m-j][i]; matrix[i+m-j][i] = matrix[i+m][i+m-j]; matrix[i+m][i+m-j] = matrix[i+j][i+m]; matrix[i+j][i+m] = tmp; } } } }; |
【版权声明】转载请注明出处:http://www.cnblogs.com/TenosDoIt/p/3768734.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架