您的位置:首页 > 其它

数组移动

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: