参考了Leetcode上的答案。我觉得比较经典。
题目的描述为:
Given input matrix =
[
[1,2,3],
[4,5,6],
[7,8,9]
],
rotate the input matrix in-place such that it becomes:
[
[7,4,1],
[8,5,2],
[9,6,3]
]
也就是顺时针转了90度。我们可以看出,这个rotate并不是沿着对角线对换,而是上下对调(或左右对调)后再沿对角线对换。 也
1 2 3 7 8 9 7 4 1
4 5 6 => 4 5 6 => 8 5 2
7 8 9 1 2 3 9 6 3
代码如下:
void rotate(vector<vector<int>>& matrix) {
reverse(matrix.begin(), matrix.end());
for (int i=0; i<matrix.size(); ++i)
for (int j=i+1; j<matrix[0].size(); ++j) //note: j starts from i+1
swap(matrix[i][j], matrix[j][i]);
}
注意:j从i+1开始。如果写成0,那就换了2次,等于没换,结果还是[[7,8,9],[4,5,6],[1,2,3]]。
那么如果是逆时针转90度呢?也就是
1 2 3 1 4 7 3 6 9
4 5 6 => 2 5 8 => 2 5 8
7 8 9 3 6 9 1 4 7`
我们可以看出它实际上是先按对角线对换,然后再上下对换。代码如下。
void anti_rotate(vector<vector<int> > &matrix) {
for (int i = 0; i < matrix.size(); ++i) {
for (int j = i + 1; j < matrix[i].size(); ++j)
swap(matrix[i][j], matrix[j][i]);
}
reverse(matrix.begin(), matrix.end());
}