旋转图像--力扣

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结果

在这里插入图片描述


总结

在这里插入图片描述

以上是关于旋转图像--力扣的主要内容,如果未能解决你的问题,请参考以下文章

力扣48. 旋转图像

力扣旋转图像

力扣——旋转图像

精选力扣500题 第68题 48. 旋转图像 寻找两个正序数组的中位数c++/java详细题解

力扣算法题—048旋转图像

力扣-48-转转图像