[算法]移位与旋转
来源:互联网 发布:阿里云数据库连接工具 编辑:程序博客网 时间:2024/06/05 18:39
下午实习机试遇到一道题目:
一个长为N的顺序表L存放了N个元素,给定p,要求将(X0, X1, ..., Xn-1)循环左移p位得到(Xp, Xp+1, ..., Xn-1, X0, X1, ..., Xp-1)。
好吧我承认当时没想太多,因为N不大直接又开了个数组按照映射关系直接拷过去了......
今晚复习数据结构的时候遇到了一个基本一模一样的题目,决定好好想一想。
一、一维数组循环移位操作与反转
void leftShift(int a[], int n, int p) {if (p==0 || p==n) {return;}reverse(a, 0, p-1);reverse(a, p, n-1);reverse(a, 0, n-1);}void reverse(int a[], int left, int right) {if (left < right) {int tmp;for (int i = 0; i < (right-left+1)/2; ++i) {tmp = a[left+i];a[left+i] = a[right-i];a[right-i] = tmp;}}}
这样实现就保证了空间复杂度将为O(1),时间复杂度为O(p)+O(n-p)+O(n) = O(n)
二、二维矩阵的旋转与反转
一维中的循环移位操作可以通过反转来实现空间复杂度为O(1),那么进入二维世界后,循环移位就变成了旋转操作,是否同样能够通过反转操作实现空间复杂度为O(1)?
假设二维矩阵matrix[N][N]行列数相同,以将其进行顺时针90°旋转为例:
首先将其上下对称反转,然后进行对角线的反转就可以得到结果了。
(假装这里有图......= =自己画张图一眼就看明白了)
void rotate(vector<vector<int>>& matrix) { for (int i = 0; i < matrix.size()/2; ++i) { for (int j = 0; j < matrix[i].size(); ++j) { int tmp = matrix[i][j]; matrix[i][j] = matrix[matrix.size()-i-1][j]; matrix[matrix.size()-i-1][j] = tmp; } } for (int i = 0; i < matrix.size(); ++i) { for (int j = i+1; j < matrix[i].size(); ++j) { int tmp = matrix[i][j]; matrix[i][j] = matrix[j][i]; matrix[j][i] = tmp; } }}
0 0
- [算法]移位与旋转
- 字符串旋转与移位
- 字符串旋转与移位
- 移位操作之旋转移位
- 移位旋转Rotation
- 移位算法
- 图像旋转算法与实现
- 图像旋转算法与实现
- 图像旋转算法与实现
- 图像旋转算法与实现
- 图像旋转算法与实现
- 图像旋转算法与实现
- 题目1479:移位和旋转
- 题目1479:移位和旋转
- 逻辑移位与算术移位
- 算术移位与逻辑移位
- 算数移位(<<, >>)与逻辑移位
- 大数乘法——逐位与移位算法
- 14.spark RDD深度解析
- 【USACO题库】4.1.1 Beef McNuggets麦香牛块
- Java并发之线程间协作Object的wait()、notify()、notifyAll()
- [数据挖掘工具] R语言书籍的学习路线图(转自格物堂)
- 自定义组件使用总结
- [算法]移位与旋转
- POJ 3421
- Swift之分支
- <<快学Scala>> 第十九章 练习8 答案
- win 7下卸载Apache
- 与网络公司合作建站流程和注意事项
- 机器学习基石第五讲:training versus testing
- iOS开发之GCD -- dispatch_group
- CNNs学习笔记(5): CNNs详细理解 Part1