博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
记一道有意思的算法题Rotate Image(旋转图像)
阅读量:6224 次
发布时间:2019-06-21

本文共 1635 字,大约阅读时间需要 5 分钟。

题出自 内容为:

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://qquna.baihongyu.com/

你可能感兴趣的文章
SOA架构设计经验分享—架构、职责、数据一致性
查看>>
微信开发之推广支持
查看>>
第 50 章 Resin
查看>>
服务器操作系统应该选择Debian/Ubuntu还是CentOS?
查看>>
Hbase集群master.HMasterCommandLine: Master exiting
查看>>
程序员面试宝典——总结
查看>>
sqlplus / as sysdba无法登录的奇怪报错
查看>>
管理的艺术(转)
查看>>
java命令行HPROF Profiler(转)
查看>>
微服务系统中的认证策略
查看>>
关于httpservletrequest的获取真实的ip
查看>>
[20170628]11g修改用户名.txt
查看>>
siebel CRM初学
查看>>
JS组件系列——Bootstrap寒冬暖身篇:弹出框和提示框效果以及代码展示
查看>>
linux命令之iotop
查看>>
老板必备:核心员工跳槽时,必聊的8个话题(转)
查看>>
C++ 中vector的使用方法
查看>>
基于mysqldump搭建gtid主从
查看>>
Apache Flink fault tolerance源码剖析(五)
查看>>
HTAP数据库 PostgreSQL 场景与性能测试之 18 - (OLAP) 用户画像圈人场景 - 数组包含查询与聚合...
查看>>