一. 题目来源:
leetcode 48. Rotate Image
二. 题目大意:
给定一个n*n的矩阵,要求在原地址空间上实现顺时针翻转90度,时间效率无限制,空间效率O(1)
三. 我的思路:
1. 如果空间没有限制,那么很简单,只要再开一个n×n的数组空间,然后对原数组每一组(a,b),其中( 0 <= a < n, 0 <= b < n),只要计算(a,b)顺时针旋转
90度后的坐标位,然后在新数组上拷贝上去即可,时间效率O(n × n), 空间效率 O(n × n)
2. 但是题要求是在原址上移位,根据老司机多年经验,这种东西一般都能有循环可以解决,然后就在纸上涂涂画画,然后发现会四组一个循环,下面是循环图
(a, b) ---------> (n-b, a) ----------> (n-a , n-b) --------------> (b, n-a) ----------------> (a, b)
找到循环图,然后代码实现就很简单了,下面是代码
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int size = matrix.size();
if(size == 0 || size == 1) return;
int term;
for(int i = 0; i < floor(size / 2.0); i++)
for(int j = i; j < size - 1 - i; j++){
term = matrix[i][j];
matrix[i][j] = matrix[size - 1 - j][i];
matrix[size - 1 - j][i] = matrix[size - 1 - i][size - 1 - j];
matrix[size - 1 - i][size - 1 - j] = matrix[j][size - 1 - i];
matrix[j][size - 1 - i] = term;
}
return;
}
};