Hackerrank - [Algo] Matrix Rotation
https://www.hackerrank.com/challenges/matrix-rotation-algo
又是一道耗了两小时以上的题,做完了才想起来,这不就是几年前在POJ上做过的一个同类问题么:置换群问题。
给定义一个MxN的矩阵,让你按照从外到内一圈圈地,逆时针旋转R次。如果你打算一次次地转,那就掉坑里了,因为这题的暴力算法比高效算法还难写对。
这其实是置换的一个特例,比如给你一个排列[2, 4, 1, 3],让你按照这个对应关系把长度为4的数组变换R次,问最后的结果。
想到了什么吗?当然是矩阵的快速幂啦!什么矩阵?一个01稀疏矩阵。
[2, 4, 1, 3]可以表示为:
[0 1 0 0]
[0 0 0 1]
[1 0 0 0]
[0 0 1 0]
联系大一学的线性代数知识,这就是这个置换操作对应的左乘变换啊(线性变换)。
把[a, b, c, d]通过一次变换变成了[b, d, a, c]。那么变一亿次之后是什么呢?实际上置换是有循环节的,不过无所谓,有快速幂就不用操心循环节了。
于是变换R次也就是把这矩阵求R次幂,于是快速幂算法就派上用场了。
这题也是类似,只不过构造这个变换矩阵麻烦点,你要看矩阵旋转一次是怎么对应的。得出矩阵以后,求幂就容易了。
时间O(N * M * log(R)),空间一样。
import re def get2DMatrix(n, m, val):
return [[val for j in xrange(m)] for i in xrange(n)] def rotate(a, r):
# n is guaranteed to be even
n = len(a)
m = len(a[0])
s = getDisplace(n, m)
s = displacePow(s, r)
b = get2DMatrix(n, m, 0)
for i in xrange(n):
for j in xrange(m):
b[i][j] = a[s[i * m + j] / m][s[i * m + j] % m]
return b def getDisplace(n, m):
s = range(n * m)
i = 0
while i < n / 2 and i < m / 2:
rr = n - 2 * i
cc = m - 2 * i
for j in xrange(1, rr, 1):
#left
s[(j + i) * m + i] = (j - 1 + i) * m + i
for j in xrange(1, cc, 1):
#down
s[(rr - 1 + i) * m + (j + i)] = (rr - 1 + i) * m + (j - 1 + i)
for j in xrange(rr - 2, -1, -1):
#right
s[(j + i) * m + (cc - 1 + i)] = (j + 1 + i) * m + (cc - 1 + i)
for j in xrange(cc - 2, -1, -1):
#top
s[i * m + (j + i)] = i * m + (j + 1 + i)
i += 1
return s def multiply(a, b):
n = len(a)
c = []
for i in xrange(n):
c.append(a[b[i]])
return c def displacePow(a, k):
if k == 1:
return a[:]
a2 = displacePow(a, k >> 1)
if k & 1:
return multiply(multiply(a2, a2), a)
else:
return multiply(a2, a2) if __name__ == '__main__':
n, m, r = map(int, re.split('\s+', raw_input().strip()))
a = []
for i in xrange(n):
a.append(map(int, re.split('\s+', raw_input().strip())))
a = rotate(a, r)
for i in xrange(n):
print(' '.join(map(str, a[i])))
Hackerrank - [Algo] Matrix Rotation的更多相关文章
- Hackerrank - Game Of Rotation 题解
旋转一个数组以得到最大值. 陷阱就是:不能排序.须要模拟操作旋转,并设计公式计算旋转后的和. 要求是O(n)时间完毕. 原题: https://www.hackerrank.com/challenge ...
- 主成分分析(PCA)原理及R语言实现
原理: 主成分分析 - stanford 主成分分析法 - 智库 主成分分析(Principal Component Analysis)原理 主成分分析及R语言案例 - 文库 主成分分析法的原理应用及 ...
- 【Unity Shaders】学习笔记——SurfaceShader(十一)光照模型
[Unity Shaders]学习笔记——SurfaceShader(十一)光照模型 转载请注明出处:http://www.cnblogs.com/-867259206/p/5664792.html ...
- 【Unity Shaders】法线纹理(Normal Mapping)的实现细节
写在前面 写这篇的目的是为了总结我长期以来的混乱.虽然题目是"法线纹理的实现细节",但其实我想讲的是如何在shader中编程正确使用法线进行光照计算.这里面最让人头大的就是各种矩阵 ...
- 主成分分析(PCA)原理及R语言实现 | dimension reduction降维
如果你的职业定位是数据分析师/计算生物学家,那么不懂PCA.t-SNE的原理就说不过去了吧.跑通软件没什么了不起的,网上那么多教程,copy一下就会.关键是要懂其数学原理,理解算法的假设,适合解决什么 ...
- Must practice programming questions in all languages
To master any programming languages, you need to definitely solve/practice the below-listed problems ...
- Unity Shader-法线贴图(Normal)及其原理
简介 以前经常听说“模型不好看啊,怎么办啊?”答曰“加法线”,”做了个高模,准备烘一下法线贴图”,“有的美术特别屌,直接画法线贴图”.....法线贴图到底是个什么鬼,当年天真的我真的被这个图形学的奇淫 ...
- 相机imu外参标定
1. 第一步初始化imu外参(可以从参数文档中读取,也可以计算出),VINS中处理如下: # Extrinsic parameter between IMU and Camera. estimate_ ...
- VINS(二)Feature Detection and Tracking
系统入口是feature_tracker_node.cpp文件中的main函数 1. 首先创建feature_tracker节点,从配置文件中读取信息(parameters.cpp),包括: ROS中 ...
随机推荐
- BZOJ1951:[SDOI2010]古代猪文(Lucas,CRT)
Description “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心……” ——选自猪王国民歌 很久很久以前,在山的那边 ...
- HDU 3613 扩展KMP
暴力枚举大水题,判断回文,扩展KMP #include <cstdio> #include <cstring> #include <algorithm> using ...
- nbu集群Alwayson相关问题
Alwayson 1. Alwayson 是否依赖于域环境? 答: 是, alwayson依赖于故障转移群集(只有在故障转移群集中的SQL Server 才能启动高可行性组功能),而故障转移群集愈依赖 ...
- IO缓冲区
标准IO提供的三种类型的缓冲模式: (1)按块缓存:在填满缓冲区后才进行实际的设备读写操作 (2)按行缓存:指在接收到换行符('\n’)之前,数据都是先缓存在缓冲区的 (3)不缓存:允许你直接读写设备 ...
- 43. Multiply Strings 字符串相乘
1. 原始题目 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 示例 1: 输入: num1 = "2&qu ...
- win10 安装YII2
YII2下载地址:http://www.yiichina.com/download 高级版本和基本版本的区别是: 基础版只有一个只有一个web应用,高级版则生成前后台.建议使用高级版,方便 Yii2框 ...
- 使用vue搭建项目(创建手脚架)
第一步:切换到创建的目录 创建项目 vue cerate [model] 第二步:切换到创建好的项目,然后创建element vue add element 第三步:创建router vue add ...
- python—递归函数
递归函数 定义:即在函数定义中自己调用自己 递归就是在过程或函数中自我调用 递归必须有递归出口,即递归结束条件 举个栗子-阶乘: def fact(n): if n == 1: return 1 re ...
- asp.net mvc Post上传文件大小限制 (转载)
最近发现在项目中使用jQuery.form插件上传比较大的文件时,上传不了,于是改了下web.config的上传文件最大限制. <configuration> <system.web ...
- sql server 自增长显式添加值
如果想在自增列添加数据,会提示我们不能插入显式值 解决: