您的位置:首页 > 其它

方形矩阵顺时针旋转90度 Rotate Image

2013-11-26 13:29 453 查看
原地变形问题。

题目:You are given an n x n 2D
matrix representing an image.Rotate the image by 90 degrees (clockwise).要求,原地进行,空间复杂度为O(1)。

思路一:直观地去旋转。观察规律就知道把每个点A[i][j]放到A[j][n-1-j]去。为了节省空间,我必须连着串有序的挨个把原位置换到新位置。规律显示这样都是四个点一组,组内只要旋转的传递一圈即可,只需要加一个tmp就能完成循环传递。那么对于整个矩阵,有多少个这样的一组四个点?

    观察发现从0,0点开始,是最外圈,最外圈的组有n-1个。逐步往里,每往里一圈,组的个数就减少2个(对称的),内圈的组越来越少。直到最里面的一圈只有一组4个点,或者只有1个点。

    一个组四个点循环传递即可,即要把A[n-1-j][i]放到A[i][j]中去。

该方法的时间复杂度为O(N*N)。

class Solution {
public:
void rotate(vector<vector<int> > &matrix) {
int n = matrix.size();
if (n <= 0)
return;

int i, j, k, tmp, temp;

for(i=0; i<=(n-1)/2; i++) //i从0到(n-1)/2
for(j=i; j<=n-2-i; j++) //j从i到n-2-i
{
tmp = matrix[i][j];
for(k=0;k<3;k++)
{
matrix[i][j] = matrix[n-1-j][i];
temp = i;
i = n-1-j;
j = temp;
}
matrix[i][j] = tmp;
temp = i; //第四次能得把i,j更新回开始的值
i = n-1-j;
j = temp;
}
}
};

思路二:有技巧地翻转。首先沿着中间水平线做对称翻转,然后沿着主对角线做对称翻转。(也可以先沿着副对角线对称翻转,再沿着水平中线对称翻转)。

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;j++)
swap(matrix[i][j], matrix[n-1-i][j]);
// 沿着主对角线翻转
for(int i=0;i<n-1;i++)
for(int j=i+1;j<n;j++)
swap(matrix[i][j], matrix[j][i]);

}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: