题目
分析
来观察下正方形矩阵旋转90度时究竟发生了什么。
观察图中颜色相同的四个位置,当旋转90度后,对应位置的元素发生了顺时针的交换。
而相隔的两个位置是中心对称的,基于此可以计算出发生交换的四个元素位置关系。
设四个位置中,位于左上角区域的位置坐标为 (i,j),
则按顺时针顺序,四个位置分别为(i,j), (j, n-i-1), (n-i-1,n-j-1), (n-j-1,i)。
其中 n 为 matrix.size(), i, j 分别为matrix的行列下标,从 0 开始。
整个矩阵的旋转可以理解为起点都在左上角区域,然后依次顺时针移动
matrix.size() 为奇数时,位置的对应关系相同,但左上角区域并不是整个矩阵的四分之一,如下图示:
其实就是多了中间列的上半部分。
那么现在捋一下如何原地操作元素:
枚举左上区域的所有位置,然后通过上面总结的位置关系直接交换元素。
对于一个位置 (i,j),需要交换三次:
- s w a p ( m a t r i x [ i ] [ j ] , m a t r i x [ j ] [ n − i − 1 ] ) ; swap(matrix[i][j], matrix[j][n-i-1]); swap(matrix[i][j],matrix[j][n−i−1]);
- s w a p ( m a t r i x [ i ] [ j ] , m a t r i x [ n − i − 1 ] [ n − j − 1 ] ) ; swap(matrix[i][j], matrix[n-i-1][n-j-1]); swap(matrix[i][j],matrix[n−