Leetcode顺时钟旋转90度

问题
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?

结合查找到的资料做个总结。
1. 对角交换+以中间线左右交换


观察交换前后数组关系,发现:
原数组第一行变成新数组最右边一列
原数组第二行变成新数组最右边第二列
……

那么代码就简单,见最后附录代码。

2. 四元组为单位旋转

分析数组,发现规律:
a[i][j] = a[n-1-j][i](左边指旋转后元素)



使用快捷键:
对于数组,终止条件为:
i<n/2
j>=i && j<n-i-1

源代码
/* Copright Reserved by MiracleCoder
* No permit to delete the link: http://blog.csdn.net/idc_void
*/
#define N 4
void PrintMatrix( int m[N][N], const char *str )
{
cout << str << endl;
for ( int i = 0; i < N; ++i )
{
for ( int j = 0; j < N; ++j )
{
cout << m[i][j] << " ";
}
cout << endl;
}
}
void Rotate( int matrix[N][N])
{
if( matrix == NULL )
return;
// print
PrintMatrix( matrix, "Before");
for ( int i = 0; i < N; ++i )
{
for ( int j = 0; j < i; ++j ) // Condition: j < i
swap( matrix[i][j], matrix[j][i]);
}
for ( int i = 0; i < N; ++i )
{
for ( int j = 0; j < N/2; ++j ) // 次数确定:每次减两个,直到只剩下一个或者零个
swap( matrix[i][j] , matrix[i][N-j-1] );
}
// print
PrintMatrix( matrix, "After rotate 90 degree ");
}
void Rotate90Degree( int matrix[N][N] )
{
// print
PrintMatrix( matrix, "Before");
for ( int i = 0; i < N/2; ++i )
{
for( int j = i; j < N - 1 - i; ++j ){
int value = matrix[i][j];
matrix[i][j] = matrix[N-1-j][i];
matrix[N-1-j][i] = matrix[N-i-1][N-1-j];
matrix[N-i-1][N-1-j] = matrix[j][N-i-1];
matrix[j][N-i-1] = value;
}
}
PrintMatrix( matrix, "After rotate 90 degree ");
}

原文地址:https://www.cnblogs.com/miraclecoder/p/4051170.html