给定一个二维方阵,求,将此方阵顺时针旋转90度。就地交换,不引入额外的存储消耗。
Given input matrix =
[
[ 5, 1, 9,11],
[ 2, 4, 8,10],
[13, 3, 6, 7],
[15,14,12,16]
],
rotate the input matrix in-place such that it becomes:
[
[15,13, 2, 5],
[14, 3, 4, 1],
[12, 6, 8, 9],
[16, 7,10,11]
]
思路:
对这些坐标进行研究,可以发现坐标是有规律的,从最外围往内进行交换,设方阵为 n * n ,每一次交换3对坐标,就可以将四条边上对应的坐标给交换完,然后循环。注意往内部循环的时候,走 n/2 即可全体交换完。
难点:
难点在于对坐标的研究,比如: a00, a03, a33, a30 这4个坐标的关系,以及 a01, a13, a32, a20 ,这四个需要交换的关系,进而推导出:aij与其另外3个坐标的关系。
class Solution { public: void rotate(vector<vector<int>>& matrix) { int n = matrix.size(); for (int i = 0; i < n/2; i++) { for (int j = i; j < n-i-1; j++) { swap(matrix[i][j], matrix[j][n - 1 - i]); swap(matrix[i][j], matrix[n - 1 - i][n - 1 - j]); swap(matrix[i][j], matrix[n-1-j][i]); } } } };