数组移动
2013-08-05 11:31
127 查看
如题,如有数组abcd1234,让数组向右边移动两位,变成了34abcd12,现在要求在特定长度的数组array中,要求移动n位,并在0(n)的时间复杂度下完成。
如果是首先我们假定数组的长度是L,如果移动的位数大于L的话,其实等同于移动了n%L位,我们如果按照循环的方式来移动数组,可得如下的代码
n=%L;
//移动n位
for(int i=0;i<n;i++){
temp = array[L-1];
for(int j=L-2;j>=0;j--){
array[j+1] = array[j];
}
array[j+1] = temp;
}
这样做,其实时间复杂度是0(n*L),这样其实并不符合题目要求达到0(n)的要求。
其实对于每一个移动的数组,我们可以看到,其实移动的过程可以分解为以下的方式。
如1234abcd如果要求向右移动四位,那么移动的过程可以这样看。
先是前四位翻转,然后是后四位,最后是整个数组在翻转。
1234abcd->4321abcd->4321dcba->abcd1234
代码如下
int reverse(int n,int m,int *A){
for(;n>m;n++,m--){
temp = A
;
A
= A[m];
A[m] = temp;
}
}
int main(){
int n;//移动的位数
reserve(0,n-1,A);
reserve(n,L-n-1,A);
reserve(0,n-1,A);
}
这样子只涉及数字的移动,时间复杂度是0(n)
如果是首先我们假定数组的长度是L,如果移动的位数大于L的话,其实等同于移动了n%L位,我们如果按照循环的方式来移动数组,可得如下的代码
n=%L;
//移动n位
for(int i=0;i<n;i++){
temp = array[L-1];
for(int j=L-2;j>=0;j--){
array[j+1] = array[j];
}
array[j+1] = temp;
}
这样做,其实时间复杂度是0(n*L),这样其实并不符合题目要求达到0(n)的要求。
其实对于每一个移动的数组,我们可以看到,其实移动的过程可以分解为以下的方式。
如1234abcd如果要求向右移动四位,那么移动的过程可以这样看。
先是前四位翻转,然后是后四位,最后是整个数组在翻转。
1234abcd->4321abcd->4321dcba->abcd1234
代码如下
int reverse(int n,int m,int *A){
for(;n>m;n++,m--){
temp = A
;
A
= A[m];
A[m] = temp;
}
}
int main(){
int n;//移动的位数
reserve(0,n-1,A);
reserve(n,L-n-1,A);
reserve(0,n-1,A);
}
这样子只涉及数字的移动,时间复杂度是0(n)
相关文章推荐
- Sicily 1934.移动小球 | 数组模拟
- 每天一道LeetCode-----将数组/链表后k个元素移动到前面
- 数据结构复习--数组的移动
- 数组移动算法算法实现
- 将数组中的数循环移动k位
- 九度OJ 1398 移动次数 (数组,模拟)
- 紫书章六例题五 移动盒子 UVA 12657 (数组模拟双向链表)
- 【小米校招笔试】一个数组是由有序数组经过n次循环移动后所得,请你用最快速度查找某个元素位置
- 【php数组函数序列】之end() - 移动数组内部指针到最后一个元素,并返回该元素的值
- 数组数据的移动实现实例化:
- 数组中移动0至后面
- php数组函数序列之prev() - 移动数组内部指针到上一个元素的位置,并返回该元素值
- vue.js移动数组位置,同时更新视图的方法
- 紫书章六例题五 移动盒子 UVA 12657 (数组模拟双向链表)
- 关于字符数组的指针移动操作
- 数组循环移动(娱乐代码)
- 传入一个数组如 {1,2,3,4,5,6,7} 从某数之后开始移动
- 一个有n个整数的递增有序数组。对它进行向左或向右循环移动若干次后,要求给出一个代码实现,尽可能快地从这个数组中寻找指定值所在的位置
- 小算法--数组中元素的移动
- 数组中移动0至后面