LeetCode HOT100 - 旋转图像

首先规律实际上是好找的

找几个点就可以发现是 (i, j) -> (j, n - 1 - i) 的形式

接着是考虑要原地修改

原地修改那么就是每次要修改 4 个位置

这样的话存一个 tmp ,剩下的先逆时针(逆序)拷贝,避免覆盖

最后考虑的是从哪些位置出发改,不会重复

1 2 3
4 5 6
7 8 9

为例,我们一行行看,
1 翻转后实际上就是 3 的位置,于是最后一个元素是不需要到的
所以第一行就是 1 2 要改

第一行操作完之后,相当于 3x3 最外围的都操作完了,所以看下一层

于是到第二层的时候,我们是从 (1, 1) 也就是 5 开始的

实际上类似的,因为和上一行是独立的,我们看作是单独的一层,因此也是操作到对应的倒数第二个位置

class Solution {
public:
    void rotate(vector<vector<int>>& a) {
        int n = a.size();
        for (int i = 0; i < n / 2; i++) {
            for (int j = i; j < n - 2 * i + i - 1; j++) {
                int x = i, y = j;
                int tmp = a[x][y];
                a[x][y] = a[n - 1 - y][x];
                a[n - 1 - y][x] = a[n - 1 - x][n - 1 - y];
                a[n - 1 - x][n - 1 - y] = a[y][n - 1 - x];
                a[y][n - 1 - x] = tmp;
            }
        }
    }
};
posted @ 2026-04-09 22:00  rdcamelot  阅读(17)  评论(0)    收藏  举报