【10】48. Rotate Image
48. Rotate Image
- Total Accepted: 96625
- Total Submissions: 259249
- Difficulty: Medium
- Contributors: Admin
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?
Solution 1:
对于90度的翻转有很多方法,一步或多步都可以解,我们先来看一种直接的方法,对于当前位置,计算旋转后的新位置,然后再计算下一个新位置,第四个位置又变成当前位置了,所以这个方法每次循环换四个数字,如下所示:
1 2 3 7 2 1 7 4 1
4 5 6 --> 4 5 6 --> 8 5 2
7 8 9 9 8 3 9 6 3
1 class Solution { 2 public: 3 void rotate(vector<vector<int>>& matrix) { 4 int n = matrix.size(); 5 for(int i = 0; i < n / 2; i++){ 6 for(int j = i; j < n - 1 - i; j++){ 7 int tmp = matrix[i][j]; 8 matrix[i][j] = matrix[n - 1 - j][i]; 9 matrix[n - 1 - j][i] = matrix[n - 1 - i][n - 1 - j]; 10 matrix[n - 1 - i][n - 1 - j] = matrix[j][n - 1 - i]; 11 matrix[j][n - 1 - i] = tmp; 12 } 13 } 14 } 15 };
Solution 2:
还有一种解法,首先以从对角线为轴翻转,然后再以x轴中线上下翻转即可得到结果,如下图所示(其中蓝色数字表示翻转轴):
1 2 3 9 6 3 7 4 1
4 5 6 --> 8 5 2 --> 8 5 2
7 8 9 7 4 1 9 6 3
1 class Solution { 2 public: 3 void rotate(vector<vector<int>>& matrix) { 4 int n = matrix.size(); 5 for(int i = 0; i < n - 1; i++){//i只能取到 n - 2, 因为n - 1是对称轴 6 for(int j = 0; j < n - 1 - i; j++){//j只能取到n - 1 - i, 在对称轴的左边 7 swap(matrix[i][j], matrix[n - 1 - j][n - 1 - i]); 8 } 9 } 10 for(int i = 0; i < n / 2; i++){//i只能取到横向中间轴的上面 11 for(int j = 0; j < n; j++){//j可以取到所有值 12 swap(matrix[i][j], matrix[n - 1 - i][j]);//按横向轴翻转,j不变;i变为n-1-i 13 } 14 } 15 } 16 };
Solution 3:
最后再来看一种方法,这种方法首先对原数组取其转置矩阵,然后把每行的数字翻转可得到结果,如下所示(其中蓝色数字表示翻转轴):
1 2 3 1 4 7 7 4 1
4 5 6 --> 2 5 8 --> 8 5 2
7 8 9 3 6 9 9 6 3
1 class Solution { 2 public: 3 void rotate(vector<vector<int>>& matrix) { 4 int n = matrix.size(); 5 for(int i = 0; i < n; i++){ 6 for(int j = i + 1; j < n; j++){//j取i - 1, 因为对称轴是(i,i) 7 swap(matrix[i][j], matrix[j][i]); 8 } 9 reverse(matrix[i].begin(), matrix[i].end());//按竖向中轴线翻转 直接按行reverse即可 10 } 11 } 12 };