记一道有意思的算法题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的时候可能溢出,那么接下来的结果就不对了,所以不能用加减法而应该用异或。

目录
相关文章
|
2月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.6、图像旋转与翻转(rotate函数、imutils环境安装、imutils任意角度旋转)
OpenCV这么简单为啥不学——1.6、图像旋转与翻转(rotate函数、imutils环境安装、imutils任意角度旋转)
31 0
|
4月前
|
计算机视觉 开发者 Python
OpenCV中图像的缩放与旋转讲解及实战演示(附Python源码)
OpenCV中图像的缩放与旋转讲解及实战演示(附Python源码)
66 0
|
6月前
|
C++
OpenCV-图像旋转Rotate
OpenCV-图像旋转Rotate
|
6月前
|
C++
C++-基于参考灰度图上色GrayToColorFromOther
C++-基于参考灰度图上色GrayToColorFromOther
|
8月前
旋转的沙漏-[ Qt绘制旋转图像]
旋转的沙漏-[ Qt绘制旋转图像]
95 0
|
10月前
|
机器学习/深度学习 算法 安全
LeetCode - #48 旋转图像(Top 100)
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
LeetCode - #48 旋转图像(Top 100)
|
编解码 计算机视觉
CV13 图像分辨率操作(图像金字塔与resize()函数)
其中,高斯核卷积运算就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值(券种不同)经过加权平均后得到。常见的 33与 55 高斯核(CV9 2D卷积与图像滤波)
138 0
|
Python
Python中Image缩放、旋转、翻转等操作
Python中Image缩放、旋转、翻转等操作
58 0
|
自然语言处理 计算机视觉
使用cv和nlp完成图像的读取缩放旋转等……
使用cv和nlp完成图像的读取缩放旋转等……
78 0
使用cv和nlp完成图像的读取缩放旋转等……
|
计算机视觉
目标检测的Tricks | 【Trick8】数据增强——随机旋转、平移、缩放、错切、hsv增强
目标检测的Tricks | 【Trick8】数据增强——随机旋转、平移、缩放、错切、hsv增强
558 0
目标检测的Tricks | 【Trick8】数据增强——随机旋转、平移、缩放、错切、hsv增强

热门文章

最新文章