题目要求将一个n*n的方阵顺时针旋转90度。使用原方阵的空间(in-place)。
考虑方阵中的一个点(i,j)
,这个位置在旋转以后会被原来在(n-1-j,i)
的点覆盖。位置(n-1-j,i)
又会被原来在(n-1-i,n-1-j)
的点覆盖。位置(n-1-i,n-1-j)
会被原来在(j,n-1-i)
的点覆盖。最后,(j,n-1-i)
会被原来在(i,j)
的点覆盖。所以这是一个四个数轮换的过程。要求使用原方阵空间,我们可以对其四分之一的部分的所有点都找四个轮换点进行轮换,这样就完成了旋转。
代码:
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size();
for(int i = 0 ; i < n / 2 ; i++) {
for(int j = 0 ; j < n / 2 + n % 2 ; j++) { //注意j的范围
int k = matrix[j][n - 1 - i];
matrix[j][n - 1 - i] = matrix[i][j];
matrix[i][j] = matrix[n - 1 - j][i];
matrix[n - 1 - j][i] = matrix[n - 1 - i][n - 1 - j];
matrix[n - 1 - i][n - 1 - j] = k;
}
}
}