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?
分析:
首先想到,纯模拟,从外到内一圈一圈的转,但这个方法太慢。
方法一:先沿主对角线反转,再沿垂直中线反转。
方法二:首先沿着副对角线翻转一次,然后沿着水平中线翻转一次。(如图所示)
方法三:首先沿着水平中线翻转一次,然后沿着主对角线翻转一次。
举个反例:先水平中线翻转,再斜对角线翻转;在3*3时则错误。
//方法一:先沿主对角线反转,再沿垂直中线反转。时间复杂度 O(n^2),空间复杂度 O(1) class Solution { public: void rotate(vector<vector<int>>& matrix) { int n = matrix[0].size(); for(int i = 0; i < n; i++) //沿主对角线反转 for(int j = i + 1; j < n; j++) //j=i,也可以 swap(matrix[i][j], matrix[j][i]); for(int i = 0; i < n; i++) //沿垂直中线反转 for(int j = 0; j < n / 2; j++) swap(matrix[i][j], matrix[i][n - 1 - j]); } };
//方法二:首先沿着副对角线翻转一次,然后沿着水平中线翻转一次。时间复杂度 O(n^2),空间复杂度 O(1) class Solution { public: void rotate(vector<vector<int>>& matrix) { int n = matrix[0].size(); for(int i = 0; i < n; i++) //沿副对角线反转 for(int j = 0; j < n - i - 1; j++) //j < n - i,也可以 swap(matrix[i][j], matrix[n - 1 - j][n - 1 - i]); for(int i = 0; i < n/2; i++) //沿水平中线反转 for(int j = 0; j < n; j++) swap(matrix[i][j], matrix[n - 1 - i][j]); } };
//方法三:首先沿着水平中线翻转一次,然后沿着主对角线翻转一次。时间复杂度 O(n^2),空间复杂度 O(1) class Solution { public: void rotate(vector<vector<int>>& matrix) { int n = matrix[0].size(); for(int i = 0; i < n/2; i++) //沿水平中线反转 for(int j = 0; j < n; j++) swap(matrix[i][j], matrix[n - 1 - i][j]); for(int i = 0; i < n; i++) //沿主对角线反转 for(int j = i + 1; j < n; j++) //j=i,也可以 swap(matrix[i][j], matrix[j][i]); } };
时间: 2024-10-04 00:25:16