记一道有意思的算法题Rotate Image(旋转图像)

简介:

题出自https://leetcode.com/problems/rotate-image/ 内容为:

You are given an n x n 2D matrix representing an image.

Rotate the image by 90 degrees (clockwise).

Follow up: 
Could you do this in-place?

简单的说就是给出一个n*n的二维数组,然后把这个数组进行90度顺时针旋转,而且不能使用额外的存储空间。

最初拿到这道题想到的就是找出每个坐标的旋转规律。假设我们是2*2的矩阵:

 
 
a b c d

进行旋转后,那么就变成了:

 
 
c a d b

所以就转换成对4个数字进行轮换,而不使用额外空间的问题。最常用的交换数值而不使用额外空间的算法就是异或,比如要交换a,b的值,那么可以写为:

 
 
a = a^b ; b = a^b ; a = a^b ;

现在是对4个数字进行轮换,轮换后的结果为a=c,b=a,c=d,d=b;

所以改写成异或的算法,那么就是:

 
 
a = a ^ b ^ c ^ d ; b = a ^ b ^ c ^ d ; d = a ^ b ^ c ^ d ; c = a ^ b ^ c ^ d ; a = a ^ b ^ c ^ d ;

接下来就是找出二维数组中角标与a,b,c,d的关系,这个其实不难。另外,我们在进行旋转处理时,我们只需要处理1/4的区域即可,因为处理一次就是调整了4个数,所以我们只处理二维数组中左上角的数值。

下面就是具体的代码:

 
 
public void Rotate( int [,] matrix) { int n = matrix.GetLength ( 0 ); for (var i = 0 ; i < (n + 1 ) / 2 ; i ++ ) { for (var j = 0 ; j < n / 2 ; j ++ ) { // var a = matrix[i, j]; // var b = matrix[j, n - i - 1]; // var d = matrix[n - i - 1, n - j - 1]; // var c = matrix[n - j - 1, i]; matrix[i, j] = matrix[i, j] ^ matrix[j, n - i - 1 ] ^ matrix[n - i - 1 , n - j - 1 ] ^ matrix[n - j - 1 , i]; matrix[j, n - i - 1 ] = matrix[i, j] ^ matrix[j, n - i - 1 ] ^ matrix[n - i - 1 , n - j - 1 ] ^ matrix[n - j - 1 , i]; matrix[n - i - 1 , n - j - 1 ] = matrix[i, j] ^ matrix[j, n - i - 1 ] ^ matrix[n - i - 1 , n - j - 1 ] ^ matrix[n - j - 1 , i]; matrix[n - j - 1 , i] = matrix[i, j] ^ matrix[j, n - i - 1 ] ^ matrix[n - i - 1 , n - j - 1 ] ^ matrix[n - j - 1 , i]; matrix[i, j] = matrix[i, j] ^ matrix[j, n - i - 1 ] ^ matrix[n - i - 1 , n - j - 1 ] ^ matrix[n - j - 1 , i]; } } }

使用异或并不是很直观,另外一个比较直观的交换两个数据的方法是加减法:

 
 
a = a + b; b = a - b; a = a - b;

我们使用异或而不使用更直观的加减法是因为a+b的时候可能溢出,那么接下来的结果就不对了,所以不能用加减法而应该用异或。

本文转自深蓝居博客园博客,原文链接:http://www.cnblogs.com/studyzy/p/4406436.html,如需转载请自行联系原作者

相关文章
|
1月前
|
机器学习/深度学习 算法 数据库
KNN和SVM实现对LFW人像图像数据集的分类应用
KNN和SVM实现对LFW人像图像数据集的分类应用
33 0
|
1月前
|
算法 索引 Python
Python3实现旋转数组的3种算法
Python3实现旋转数组的3种算法
21 0
|
2天前
|
文字识别 算法 计算机视觉
图像倾斜校正算法的MATLAB实现:图像倾斜角检测及校正
图像倾斜校正算法的MATLAB实现:图像倾斜角检测及校正
12 0
|
1月前
|
机器学习/深度学习 算法 计算机视觉
利用深度学习算法实现图像风格转换技术探究
本文将通过深入分析深度学习算法在图像处理领域的应用,探讨如何利用神经网络实现图像风格转换技术。通过研究不同风格迁移算法的原理和实现方式,揭示其在艺术创作、图像编辑等领域的潜在应用和挑战。
|
1月前
|
编解码 算法 计算机视觉
基于FPGA的图像最近邻插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
基于FPGA的图像最近邻插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
|
2月前
|
机器学习/深度学习 算法 搜索推荐
【实操】数据扩增:Retinex算法用于图像颜色恢复和对比度增强
【实操】数据扩增:Retinex算法用于图像颜色恢复和对比度增强
30 0
【实操】数据扩增:Retinex算法用于图像颜色恢复和对比度增强
|
2月前
|
算法 计算机视觉
基于Harris角点的多视角图像全景拼接算法matlab仿真
基于Harris角点的多视角图像全景拼接算法matlab仿真
|
2月前
|
算法
基于稀疏表示的小波变换多光谱图像融合算法matlab仿真
基于稀疏表示的小波变换多光谱图像融合算法matlab仿真
|
1月前
|
机器学习/深度学习 算法 生物认证
基于深度学习的人员指纹身份识别算法matlab仿真
基于深度学习的人员指纹身份识别算法matlab仿真
|
25天前
|
传感器 算法 计算机视觉
基于肤色模型和中值滤波的手部检测算法FPGA实现,包括tb测试文件和MATLAB辅助验证
该内容是关于一个基于肤色模型和中值滤波的手部检测算法的描述,包括算法的运行效果图和所使用的软件版本(matlab2022a, vivado2019.2)。算法分为肤色分割和中值滤波两步,其中肤色模型在YCbCr色彩空间定义,中值滤波用于去除噪声。提供了一段核心程序代码,用于处理图像数据并在FPGA上实现。最终,检测结果输出到&quot;hand.txt&quot;文件。