翻转方阵

来源:互联网 发布:怎么选购冰箱知乎 编辑:程序博客网 时间:2024/05/01 22:46

描述:给定一个N*N的矩阵,要求按顺时针旋转矩阵九十度,并返回旋转后的矩阵。

思路一:申请一个N*N空间,存储原始矩阵副本,原始矩阵的第i行是旋转九十度后的第(n-1-i)列,第j列是旋转九十度后的第j行。时间复杂度为平方级,空间复杂度为平方级。

class Solution{public:void rotateMatrix(int &A[][],int n){int **copy=new int *[n];for(int i=0;i<n;i++)  copy[i]=new int[n];for(int i=0;i<n;i++)  for(int j=0;j<n;j++)    copy[i][j]=A[i][j];for(int i=0;i<n;i++)  for(int j=0;j<n;j++)    A[j][n-1-i]=copy[i][j];delete [][] copy;   }}; 
思路二:可以将旋转九十度分成两个步骤:1.首先按照副对角线交换元素;2.按照水平中线交换元素。如图:

class Solution{public:void rotateMatrix(int &A[][],int n){for(int i=0;i<n;i++)//先按照副对角线交换对称元素 {for(int j=0;j<n-i;j++){swap(A[i][j],A[n-1-i][n-1-j]);} } for(int i=0;i<n/2;i++)//再按照水平中心线交换对称元素{for(int j=0;j<n;j++){swap(A[i][j],A[n-1-i][j]);} }    }}; 
或者1.先按照水平中心线交换元素;2.然后按照主对角线交换元素。如图:

class Solution{public:void rotateMatrix(int &A[][],int n){for(int i=0;i<n/2;i++)//先按照水平中心线交换对称元素{for(int j=0;j<n;j++){swap(A[i][j],A[n-1-i][j]);} } for(int i=0;i<n;i++)//再按照主对角线交换对称元素 {for(int j=i+1;j<n;j++){swap(A[i][j],A[j][i]);}}    }}; 
两种方案的时间复杂度都有线性,空间复杂度都为1。

0 0
原创粉丝点击