如下图所示, 每次交换外围一圈数, 每次交换3次就能把4条边上的数都放到正确位置
最后旋转时的坐标, 左上为(k, k), 右上为(k, n-k-1), 左下为(n-k-1, k), 右下为(n-k-1, n-k-1)
只需要循环每一行的从起点k开始到 n-k-1 的前一个为止就行了.
class Solution {
public:
void rotate(vector<vector<int>>& a) {
int n = a.size();
int k = 0;
while (k < n / 2) {
for (int i = k; i < n - k - 1; i++) {
swap(a[k][i], a[i][n - k - 1]);
swap(a[k][i], a[n - i - 1][k]);
swap(a[n - i - 1][k], a[n - k - 1][n - i - 1]);
}
k++;
}
}
};