题目
给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。
不占用额外内存空间能否做到?
示例 1:
给定 matrix = [ [1,2,3], [4,5,6], [7,8,9] ], 原地旋转输入矩阵,使其变为: [ [7,4,1], [8,5,2], [9,6,3] ]
示例 2:
给定 matrix = [ [ 5, 1, 9,11], [ 2, 4, 8,10], [13, 3, 6, 7], [15,14,12,16] ], 原地旋转输入矩阵,使其变为: [ [15,13, 2, 5], [14, 3, 4, 1], [12, 6, 8, 9], [16, 7,10,11] ] 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/rotate-matrix-lcci 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题
此题和leetcode-48:旋转图像是一样的,答案解析可以看此链接
不适用额外空间,有方法一和方法三,推荐方法一
方法一:转置+水平对称
class Solution { public: void rotate(vector<vector<int>>& matrix) { int N=matrix.size(); //转置 for(int i=0;i<N;i++){ for(int j=0;j<i;j++){ swap(matrix[i][j],matrix[j][i]); } } //水平对称 for(int i=0;i<N;i++){ for(int j=0;j<N/2;j++){//注意不能j<=N/2,因为当N=4时,N/2=2超过中间了 swap(matrix[i][j],matrix[i][N-1-j]); } } } };
方法二:使用辅助数组
class Solution { public: void rotate(vector<vector<int>>& matrix) { int N=matrix.size(); vector<vector<int>> res(N,vector<int>(N,0)); for(int i=0;i<N;i++){ for(int j=0;j<N;j++){ res[i][j]=matrix[N-1-j][i]; } } matrix=res; } };
方法三:原地旋转
这种方法比较麻烦
并且注意遍历的时候i
j<(n+1)/2,因为可能是矩形边长为奇数时,如果依然j
class Solution { public: void rotate(vector<vector<int>>& matrix) { int n=matrix.size(); for(int i=0;i<n/2;i++){ for(int j=0;j<(n+1)/2;j++){ int tmp=matrix[i][j]; matrix[i][j]=matrix[n-j-1][i]; matrix[n-j-1][i]=matrix[n-i-1][n-j-1]; matrix[n-i-1][n-j-1]=matrix[j][n-i-1]; matrix[j][n-i-1]=tmp; } } } };