看到这个题目,通常是先实现题目意思再说,通常咱们按照正常思路解题,将数组元素循环右移,好比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; } }
这样的话就能够在线性时间内实现向右移动操做了