数据结构与算法:旋转图像

1.题目

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

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

2.示例:

3.分析

本题一般是有三种思路解决:

(1)第一种是开辟新的一个新空间,把原来的数组中的数字旋转90°后,移到新的空间,可得到结果。这种方式,思路简单,但空间复杂度大,而且本题已经规定不能使用这种方法。这里不做重点介绍。

(2)第二种是利用线性代数中对行列式或矩阵的特点进行解决。这种方式需要一定的线性代数基础。线性代数是非常重要的,很多算法都会有线性代数的思想。就本题而言,先上下对称交换,再正对角线交换,就可以得到最终的结果。

(3)找规律,这也是我的方法。仔细观察下图:

规律就是,一层一层的旋转90°。时间复杂度是小于O(n^2)的。

3.代码(第三种方式)

void rotate(int** matrix, int matrixSize, int* matrixColSize) {
    for(int i=0;i<matrixSize/2;i++)//代表第几层,这里从最外层开始旋转,然后由外层逐渐过渡到内层,一层一层的旋转
    {
        for(int j=i;j<matrixSize-i-1;j++)//每一层的元素个数都会依次减少,减少的规律就是行数和列数都减少1.
        {
            //这里就是顺时钟旋转,顺时钟平移
            int temp=matrix[i][j];
            matrix[i][j]=matrix[matrixSize-j-1][i];
            matrix[matrixSize-j-1][i]=matrix[matrixSize-i-1][matrixSize-j-1];
            matrix[matrixSize-i-1][matrixSize-j-1]=matrix[j][matrixSize-i-1];
            matrix[j][matrixSize-i-1]=temp;
        }
    }
}

4.总结:

本题难度不大,如果熟悉线性代数,基本上可以快速的找到思路。如果没有线性代数基础,也可以找到第三种方式来解决。对线性代数掌握越多,越有利于解决算法相关的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值