1.题目
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
2.示例:
3.分析
本题一般是有三种思路解决:
(1)第一种是开辟新的一个新空间,把原来的数组中的数字旋转90°后,移到新的空间,可得到结果。这种方式,思路简单,但空间复杂度大,而且本题已经规定不能使用这种方法。这里不做重点介绍。
(2)第二种是利用线性代数中对行列式或矩阵的特点进行解决。这种方式需要一定的线性代数基础。线性代数是非常重要的,很多算法都会有线性代数的思想。就本题而言,先上下对称交换,再正对角线交换,就可以得到最终的结果。
(3)找规律,这也是我的方法。仔细观察下图:
规律就是,一层一层的旋转90°。时间复杂度是小于O(n^2)的。
3.代码(第三种方式)
void rotate(int** matrix, int matrixSize, int* matrixColSize) {
for(int i=0;i<matrixSize/2;i++)//代表第几层,这里从最外层开始旋转,然后由外层逐渐过渡到内层,一层一层的旋转
{
for(int j=i;j<matrixSize-i-1;j++)//每一层的元素个数都会依次减少,减少的规律就是行数和列数都减少1.
{
//这里就是顺时钟旋转,顺时钟平移
int temp=matrix[i][j];
matrix[i][j]=matrix[matrixSize-j-1][i];
matrix[matrixSize-j-1][i]=matrix[matrixSize-i-1][matrixSize-j-1];
matrix[matrixSize-i-1][matrixSize-j-1]=matrix[j][matrixSize-i-1];
matrix[j][matrixSize-i-1]=temp;
}
}
}
4.总结:
本题难度不大,如果熟悉线性代数,基本上可以快速的找到思路。如果没有线性代数基础,也可以找到第三种方式来解决。对线性代数掌握越多,越有利于解决算法相关的问题。