数组循环移位

看到这个题目,通常是先实现题目意思再说,通常咱们按照正常思路解题,将数组元素循环右移,好比abcd1234,倘若循环四位,就是4abcd123->34abd12->234abcd1->1234abcd,这样的话代码很简单:java

RightShift(int [] arr,int N,int K){
    while(K--){
        int t = arr[N-1];
        for(int i = N-1;i>0; i--){
        }
        arr[0] = t;
    }
}

这样写是能够实现循环向右移动,可是这样的时间复杂度实O(N * K),是不符合题目要求的。那么还须要别的解法。数组

咱们经过观察看以看到,数组abcd234向右移动K位,至关于向左移动-K位,向右移动跟向左移动本质上是同样的。code

在考虑解题的同时,咱们应该想到的是K的取值是能够大于N的,不要让惯性思惟束缚了咱们的大脑,倘若K>N,那么数组向右移动4位跟向右移动12位,20,28是等同的,那么咱们能够先作一个处理,K=K%N,这样咱们的代码就变成了:class

RightShift(int [] arr,int N,int K){
    K=K % N ;
    while(K--){
        int t = arr[N-1];
        for(int i = N-1;i>0; i--){
        }
        arr[0] = t;
    }
}

这样结果的话,运算的时间复杂度变成了O(N * N ),时间复杂度下降了,可是还不符合题目要求;,继续探索循环

假如abcd234向右移动四位的话,咱们能够发现实际上是abcd跟1234兑换了一下,把两部分分别当作一个总体,而后兑换,具体步骤以下:移动

一、abcd倒叙->dcba1234时间

二、1234倒叙->dcba4321while

三、所有倒叙->1234abcdco

按照这个思路写代码的话就变成了以下结果:思维

ReghtShift(int [] arr,int N,int K){
    K%=N;
    Reverse(int [] arr,0,N-k-1);
    Reverse(int [] arr,N-K,N-1);
    Reverse(int [] arr,0,N-1);
}

Reverse(int [] arr,int b,int e){
    for(;b<e;b++,e--){
        int temp = arr[e];
            arr[e] = arr[b];
            arr[b] = temp;
    }
}

这样的话就能够在线性时间内实现向右移动操做了

相关文章
相关标签/搜索