旋转图像
@[toc]
一、题目描述
分析
方法一:旋转 + 翻转
- 第一步以对角线为轴,翻转对角线两侧的元素
- 第二部以每行的中点为轴翻转左右两次的元素
代码
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
//按对角线进行翻转
for(int i = 0;i < matrix.size();i++)
{
for(int j = i;j < matrix.size();j++)
{
swap(matrix[i][j],matrix[j][i]);
}
}
//每行进行翻转
for(auto& e : matrix)
{
reverse(e.begin(),e.end());
}
}
};
方法二:逐层逐位置偏移
- 对每个‘相同位置‘的元素进行旋转,即对应图中每种颜色对元素
- 当一层旋转完成后,进入内层继续进行对应位置元素的旋转
对应坐标变换图:
代码
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int pos1 = 0;
int pos2 = matrix[0].size() - 1;
//结束条件是只有一个元素的时候
while (pos1 < pos2)
{
int add = 0;
//注意add的范围
while (add < pos2 - pos1)
{
//旋转对应位置的4个元素
int temp = 0;
temp = matrix[pos1][pos1 + add];
matrix[pos1][pos1 + add] = matrix[pos2 - add][pos1];
matrix[pos2 - add][pos1] = matrix[pos2][pos2 -add];
matrix[pos2][pos2 -add] = matrix[pos1 + add][pos2];
matrix[pos1 + add][pos2] = temp;
add++;
}
//进入矩阵的内一层继续对应位置的旋转
pos1++;
pos2--;
}
}
};
或:
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n = (int)matrix.size();
//(n + 1) / 2为总的循环次数,也就是层数,每一圈旋转完毕后矩阵缩小一圈,
// + 1的目的是向上取整
for (int i = 0; i < (n + 1) / 2; i ++)
{
//j可以理解为add
for (int j = 0; j < n / 2; j++)
{
int temp = matrix[n - 1 - j][i];
matrix[n - 1 - j][i] = matrix[n - 1 - i][n - j - 1];
matrix[n - 1 - i][n - j - 1] = matrix[j][n - 1 -i];
matrix[j][n - 1 - i] = matrix[i][j];
matrix[i][j] = temp;
}
}
}
};
评论区