力扣48:旋转矩阵

力扣48:旋转矩阵

题目

给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

思路

这道题让我们在原地旋转矩阵不能使用另外一个矩阵辅助旋转,那么如果我们去掉这个条件这道题有什么思路呢?很简单,这里我们设行是i,列是j,从图中我们可以发现在旋转之后原本的第一行变成了最后一列,第二行变成了倒数第二列。而其中的数字顺序是没有变化的所以我们可以得出一个公式
m a t r i x i j = m a t r i x j n − i − 1 matrixij = matrixjn-i-1 matrixij=matrixjn−i−1

这个公式左边是原本的位置右边是旋转后的位置,在有了这个公式后每个位置的的旋转后位置就知道了所以我们只需要创建一个新的矩阵让matrixjn-i-1 = matrixij即可。

但是现在这道题需要我们原地旋转矩阵所以这个方法就没法用了,那么我们重新聚焦于这个公司,为什么得到这个公式后我们没法原地旋转这个矩阵呢因为我们会给右边那个位置的值给覆盖掉,想要避免这个情况我们可以定义一个temp来存储它的值,所以我们现在只要知道右边那个位置旋转之后的位置在哪就可以了,一样还是这个公式只不过我们是把它的行列当作一个整体来看就可以了
m a t r i x j n − i − 1 = m a t r i x n − i − 1 n − j − 1 matrixjn-i-1 = matrixn-i-1n-j-1 matrixjn−i−1=matrixn−i−1n−j−1

那么又回到了原来的问题,覆盖的位置的值还是用temp来保存那么它旋转后的位置在哪呢?一样用公式
m a t r i x n − i − 1 n − j − i = m t r i x n − j − 1 i matrixn-i-1n-j-i = mtrixn-j-1i matrixn−i−1n−j−i=mtrixn−j−1i

继续还是一样的思路,再用公式
m a t r i x n − j − i i = m a t r i x i j matrixn-j-ii = matrixij matrixn−j−ii=matrixij

我们发现转了一圈又回来了,所以这就是一个圈,四个位置形成一个圈。我们可以用temp存储matrixij的值然后一个一个的赋值。

那么既然是四个形成一圈我们是不是可以把整个矩阵分成四部分这样我们只需要遍历其中的一部分就可以完成整个旋转的操作了,所以问题又出现了这是一个n*n的矩阵我们要怎么分成四部分呢?分两种情况,n为偶数和n为奇数。

当n为偶数时分成四部分后一部分的数量就是n^2/4即(n/2)*(n/2)。

当n为奇数时我们要注意中间的位置是不会动的所以分成四部分后一部分的数量就是(n^2-1)/4,利用平方差公式和一些因式分解就可以得到最后的结果是(n-1)/2*(n+1)/2。

这两个情况一结合我们就可以发现我们需要遍历的行就是n/2,需要遍历的列是(n+1)/2。

代码

cpp 复制代码
class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int n = matrix.size();
        for (int i = 0; i < n / 2; i++) {           // 行
            for (int j = 0; j < (n + 1) / 2; j++) { // 列
                int temp = matrix[i][j];
                matrix[i][j] = matrix[n - j - 1][i];
                matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1];
                matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1];
                matrix[j][n - i - 1] = temp;
            }
        }
    }
};
相关推荐
2601_9624408418 小时前
计算机毕业设计之jsp旅游网站管理系统
java·开发语言·算法·课程设计·旅游·推荐算法
池塘的蜗牛18 小时前
AFDM波形基于DFT的通感一体化
算法
147API18 小时前
Claude global workspace 研究给智能体测试提了一个醒
人工智能·算法·机器学习
葫三生18 小时前
《论三生原理》与模糊数学的关联、异同、互补关系?
人工智能·科技·算法·机器学习·开源
我命由我1234519 小时前
方差(实例实操、与标准差的区别)
java·数据结构·算法·数据分析·java-ee·intellij-idea·idea
闲研随记19 小时前
【文献阅读 ICML 2026】RL算法:Critique-GRPO
论文阅读·算法·llm·强化学习·rl·icml·grpo
民乐团扒谱机19 小时前
【微实验】从迷雾中看清世界:卡尔曼滤波的数学诗意与MATLAB实践
人工智能·算法·matlab·卡尔曼滤波·kalman
什巳19 小时前
JAVA练习275-乘积最大子数组
java·开发语言·数据结构·算法
@踏雪寻梅19 小时前
27. 移除元素
算法
小牛不牛的程序员19 小时前
利用Claude Code构建自动化需求挖掘工具:从原理到实践
java·算法·自动化