给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int len = matrix.size();
int cycle = len/2;
for(int i = 0; i < cycle; i++) {
int left_upper_row = i;
int left_upper_col = i;
int left_down_row = len - 1 - i;
int left_down_col = i;
int right_upper_row = i;
int right_upper_col = len - 1 - i;
int right_down_row = len - 1 - i;
int right_down_col = len - 1 - i;
// 右 (left_upper_row, left_upper_col) 到 (left_upper_row, k1) 到 (left_upper_row, right_upper_col - 1)
// 下 (left_upper_row, right_upper_col) 到 (k2, right_upper_col) 到 (right_down_row - 1, right_down_col)
// 左 (right_down_row, right_down_col) 到 (right_down_row, k3) 到 (right_down_row, left_down_col + 1)
// 上 (left_down_row, left_down_col) 到 (k4, left_down_col) 到 (left_upper_row + 1, left_down_col)
// 对 k1、 k2、 k3、 k4 化简 为 k 的表达式
// 右 (left_upper_row, left_upper_col) 到 (left_upper_row, k) 到 (left_upper_row, right_upper_col - 1)
// 下 (left_upper_row, right_upper_col) 到 (k2, right_upper_col) 到 (right_down_row - 1, right_down_col)
// 左 (right_down_row, right_down_col) 到 (right_down_row, k3) 到 (right_down_row, left_down_col + 1)
// 上 (left_down_row, left_down_col) 到 (k4, left_down_col) 到 (left_upper_row + 1, left_down_col)
// => k1 = k
// k2 - left_upper_row = k - left_upper_col
// => k2 = left_upper_row + k - left_upper_col
// right_down_col - k3 = k - left_upper_col
// => k3 = right_down_col - k + left_upper_col
// left_down_row - k4 = k - left_upper_col
// => k4 = left_down_row - k + left_upper_col
for(int k = left_upper_col; k < right_upper_col; k++) {
// 把右侧的取出来
// 把上侧的放到右侧
// 把左侧的放到上侧
// 把下侧的放到左侧
// 把取出来的放到下侧
int tmp = matrix[left_upper_row][k];
matrix[left_upper_row][k] = matrix[left_down_row - k + left_upper_col][left_down_col];
matrix[left_down_row - k + left_upper_col][left_down_col] = matrix[right_down_row][right_down_col - k + left_upper_col];
matrix[right_down_row][right_down_col - k + left_upper_col] = matrix[left_upper_row + k - left_upper_col][right_upper_col];
matrix[left_upper_row + k - left_upper_col][right_upper_col] = tmp;
}
}
}
};
len行len列
3行3列旋1次
2行2列旋1次
4行4列旋2次
所以外围要旋 len/2 次
1 2 3
4 5 6
7 8 9
曾经面试的耻辱!