旋转图像--力扣
Posted 穿迷彩服的鲨鱼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了旋转图像--力扣相关的知识,希望对你有一定的参考价值。
前言
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
一、示例
1.示例
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]
2.示例
输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]
3.示例
输入:matrix = [[1]]
输出:[[1]]
4.示例
输入:matrix = [[1,2],[3,4]]
输出:[[3,1],[4,2]]
二、代码解析
1.开始旋转
代码如下(示例):
void rotate(vector<vector<int>>& matrix)
{
/*法一使用辅助数组(不符合题目要求)*/
/*例[1,2,3]
* [4,5,6]
* [7,8,9]
* 外循环执行第一次,内循环执行把[7,4,1]放入临时数组里,之后把临时数组放入新二位数组里
* 外循环执行第二次,内循环执行把[8,5,2]放入临时数组里,之后把临时数组放入新二位数组里
* 外循环执行第三次,内循环执行把[9,6,3]放入临时数组里,之后把临时数组放入新二位数组里
* 执行完循环之后得
* [7,4,1]
* [8,5,2]
* [9,6,3]
*/
int len = matrix.size();
vector<vector<int>> newMatrix;//新二维数组
for (int i = 0; i < len; ++i)
{
vector<int> tempNums;//临时一维数组
for (int j = len - 1; j >= 0; --j)
{
tempNums.push_back(matrix[j][i]);//把旋转后的第一排存储到临时数组里
}
newMatrix.push_back(tempNums);//一排一排传入数组中
}
matrix.clear();//清空原数组
matrix = newMatrix;//值拷贝
/*法二原地旋转*/
/*例[1,2,3]
* [4,5,6]
* [7,8,9]
* 外循环执行第一次后,内循环执行第一次时,设置临时变量,执行后得到
* [7,2,1]
* [4,5,6]
* [9,8,3] 执行之后发现时原地旋转,使之四个角的数字旋转了90
* 以此类推,每次只旋转四个数字即可达到原地旋转条件
* 执行完循环之后得
* [7,4,1]
* [8,5,2]
* [9,6,3]
*/
int n = matrix.size();
for (int i = 0; i < n / 2; ++i)
{
for (int j = 0; j < (n + 1) / 2; ++j)
{
int temp = matrix[i][j];
matrix[i][j] = matrix[n - j - 1][i];
matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1];
matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1];
matrix[j][n - i - 1] = temp;
}
}
}
2.测试代码
代码如下(示例):
#include<iostream>
#include<vector>
using namespace std;
void rotate(vector<vector<int>>& matrix)
{
/*法一使用辅助数组(不符合题目要求)*/
/*例[1,2,3]
* [4,5,6]
* [7,8,9]
* 外循环执行第一次,内循环执行把[7,4,1]放入临时数组里,之后把临时数组放入新二位数组里
* 外循环执行第二次,内循环执行把[8,5,2]放入临时数组里,之后把临时数组放入新二位数组里
* 外循环执行第三次,内循环执行把[9,6,3]放入临时数组里,之后把临时数组放入新二位数组里
* 执行完循环之后得
* [7,4,1]
* [8,5,2]
* [9,6,3]
*/
int len = matrix.size();
vector<vector<int>> newMatrix;//新二维数组
for (int i = 0; i < len; ++i)
{
vector<int> tempNums;//临时一维数组
for (int j = len - 1; j >= 0; --j)
{
tempNums.push_back(matrix[j][i]);//把旋转后的第一排存储到临时数组里
}
newMatrix.push_back(tempNums);//一排一排传入数组中
}
matrix.clear();//清空原数组
matrix = newMatrix;//值拷贝
/*法二原地旋转*/
/*例[1,2,3]
* [4,5,6]
* [7,8,9]
* 外循环执行第一次后,内循环执行第一次时,设置临时变量,执行后得到
* [7,2,1]
* [4,5,6]
* [9,8,3] 执行之后发现时原地旋转,使之四个角的数字旋转了90
* 以此类推,每次只旋转四个数字即可达到原地旋转条件
* 执行完循环之后得
* [7,4,1]
* [8,5,2]
* [9,6,3]
*/
int n = matrix.size();
for (int i = 0; i < n / 2; ++i)
{
for (int j = 0; j < (n + 1) / 2; ++j)
{
int temp = matrix[i][j];
matrix[i][j] = matrix[n - j - 1][i];
matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1];
matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1];
matrix[j][n - i - 1] = temp;
}
}
/*测试结果*/
for (int i = 0; i < len; i++)
{
for (int j = 0; j < len; j++)
{
cout << "[" << matrix[i][j] << "]";
}
cout << endl;
}
}
int main()
{
vector<vector<int>> newMatrix = { {5, 1, 9, 11},{2, 4, 8, 10},{13, 3, 6, 7},{15, 14, 12, 16} };
rotate(newMatrix);
return 0;
}
3结果
总结
以上是关于旋转图像--力扣的主要内容,如果未能解决你的问题,请参考以下文章