您的位置:首页 > 其它

【LeetCode】48. Rotate Image解法及注释

2016-04-06 10:02 288 查看
48. 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?

【分析】

此题要求将一个二维矩阵旋转90度,官方认证的难度是“Medium”,个人觉得此题达不到这个Level。既然是旋转矩阵,寻找规律就很重要了,简单在草稿上画一下:



我们可以看出:对于一个N阶矩阵,旋转过后,原来的“”变成了“”,第i行变成了第N-i-1列,即A[i][j]-->A[j][N-i-1],但是,直接通过一重循环是不能完成转换的,细想:在第0行与第2列的交换中,我们已经改变了原来矩阵第1行中“6”和第二行“9”的位置,如此,交换后已经不满足即A[i][j]-->A[j][N-i-1]的规律,因此,在不使用额外空间的情况下通过一次变换达到目标不太现实。

鉴于上述分析,我们可以将行列的变换分步实现:首先将矩阵的行转换成列,然后再交换列的顺序,值得注意的是,第二步中列顺序的交换是一种“对折”,第0列与最后一列交换,第一列与倒数第二列交换。

A[i][j]-->A[j][N-i-1]转换为:A[i][j]-->A[j][i]-->A[j][N-i-1]



【解法】

根据上述分析,很容易写出程序:

class Solution {
public:
void rotate(vector<vector<int>>& matrix) {

if (matrix.size()==0)//矩阵为空,直接返回
return;
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, j=n-1; i<j; i++,j--)
{
for (int k=0; k<n; k++)
swap(matrix[k][i], matrix[k][j]);
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: