LeetCode--48.旋转图像
解题思路:
1.获取信息:
给定一个二维方阵表示一个图像,将图像顺时针旋转90度
限制条件:必须原地旋转图像,不能使用另一个矩阵来旋转图像
2.分析题目:
限制不能使用另一个矩阵来旋转图像,但是我们硬要使用,可不可以呢?
当然是可以,但是这道题我没有写这种方法
我们发现,旋转九十度,可以将这个矩阵,一圈一圈剥下来,那每一条边可以看作是一个数组,也就是交换了一下数组的位置
所以,我们可以使用一个长度为n的数组来作为辅助存储空间来解这道题
但是,我也没有写这种方法,因为它既然说了不能使用另一个矩阵来旋转图像,那么我们就严格一点,就当它不能使用任何辅助存储空间
那么该怎么做呢?
旋转九十度,实际上就是四条边的旋转,四条边的旋转,也就是一些元素的位置交换,我们可以延续上面的可以一圈圈剥开的思路
在每一圈剥开的时候,我们就处理剥开的那一圈,这样处理大概n/2次就可以旋转完
那么,怎么处理剥开的那一圈呢?
由于只有四条边,所以只用交换四次,我们可以将四条边上我们要交换的元素存储下来,就是四个元素,把它们的位置依次交换即可
每条边有几个元素,我们就按上述操作处理几次,就可以得出结果了
或者说,你想快一点,把时间复杂度做好看一点,你可以将矩阵看作是一个风车,它是由四块扇叶组成的,我们依次交换扇叶的位置,就可以得出结果了
不过这次题解我就写了一种方法,就是不用辅助存储空间的方法,因为这道题可以说有点单调,每种方法的核心其实是大差不差的
3.示例查验:
你可以根据示例来检验你获取的信息是否正确,自己有没有理解这道题,并且可以检验自己的思路
4.尝试编写代码:
(1)常规法:
思路:我已经在分析题目环节说过了,就不作过多的阐述了
class Solution {
public:void rotate(vector<vector<int>>& matrix) {int n=matrix.size();int index=0;while(index<n/2){int si=layer;for(int i=si;i<n-1-si;i++){int top=matrix[si][i];//记录下左上方的元素matrix[si][i]=matrix[n-1-i][si];//左下方填入左上方matrix[n-1-i][si]=matrix[n-1-si][n-1-i];//右下方填入左下方matrix[n-1-si][n-1-i]=matrix[i][n-1-si];//右上方填入右下方matrix[i][n-1-si]=top;//右上方填入左上方}index++;}}
};
本次题解到此为止,你可以好好休息一下了,晚安