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度

例如

image  旋转后变为image

 

算法1

先将矩阵转置,然后把转置后的矩阵每一行翻转

image    转置变为   image   每一行翻转变为 image

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。

image

旋转一个矩阵,相当于把每一个环都旋转。如何旋转一个环呢?以最外层的环举例:                      本文地址

旋转前:image ,旋转后:image

 

我们把环分成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;
             }
         }
     }
};





本文转自tenos博客园博客,原文链接:http://www.cnblogs.com/TenosDoIt/p/3768734.html,如需转载请自行联系原作者

目录
相关文章
LeetCode 189. Rotate Array
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
78 0
LeetCode 189. Rotate Array
|
索引
LeetCode 61. Rotate List
给定链表,将列表向右旋转k个位置,其中k为非负数。
80 0
LeetCode 61. Rotate List
LeetCode 48. Rotate Image
给定一个n x n的二维矩阵,以顺时针方向旋转90度
80 0
LeetCode 48. Rotate Image
LeetCode 189. 旋转数组 Rotate Array
LeetCode 189. 旋转数组 Rotate Array
|
机器学习/深度学习 存储 人工智能
LeetCode 832. Flipping an Image
LeetCode 832. Flipping an Image
102 0
|
Python
Leetcode-Easy 796. Rotate String
Leetcode-Easy 796. Rotate String
65 0
Leetcode-Easy 796. Rotate String
LeetCode之Rotate Array
LeetCode之Rotate Array
121 0
LeetCode 61:旋转链表 Rotate List
​给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。 Given a linked list, rotate the list to the right by k places, where k is non-negative.
3097 0
|
算法 Java 索引
LeetCode 189:旋转数组 Rotate Array
公众号:爱写bug(ID:icodebugs) 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。 Given an array, rotate the array to the right by k steps, where k is non-negative.
759 0
|
C++
LeetCode 189 Rotate Array(旋转数组)
版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/50600861 翻译 通过K步将一个有着n个元素的数组旋转到右侧。
773 0