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?
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 4void 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] << "\t";}cout << endl;}}void Rotate( int matrix[N][N]){if( matrix == NULL )return;PrintMatrix( matrix, "Before");for ( int i = 0; i < N; ++i ){for ( int j = 0; j < i; ++j ) // Condition: j < iswap( 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] );}PrintMatrix( matrix, "After rotate 90 degree\n");}void Rotate90Degree( int matrix[N][N] ){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\n");}

浙公网安备 33010602011771号