數組循環移位

看到這個題目,通常是先實現題目意思再說,通常咱們按照正常思路解題,將數組元素循環右移,好比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;
    }
}

這樣的話就能夠在線性時間內實現向右移動操做了

相關文章
相關標籤/搜索