看到這個題目,通常是先實現題目意思再說,通常咱們按照正常思路解題,將數組元素循環右移,好比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; } }
這樣的話就能夠在線性時間內實現向右移動操做了