[算法]移位与旋转

来源:互联网 发布:阿里云数据库连接工具 编辑:程序博客网 时间: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
原创粉丝点击