Question:
Rotate an array of n elements to the right byk steps.
For example, with n = 7 and k = 3, the array[1,2,3,4,5,6,7]
is rotated to [5,6,7,1,2,3,4]
.
1)cost O(n*(k%N)) time ,最暴力效率最低的方法
public void rotate(int[] nums, int k) {
int N=nums.length;
k=k%N;
for(int i=0;i<k;i++){
int temp=nums[N-1];
for(int j=N-1;j>0;j--){
nums[j]=nums[j-1];
}
nums[0]=temp;
}
}</span>
2)cost O(n) time,O(n)space,需要借助一个额外的数组
public void rotate(int []nums,int k){
int N=nums.length;
k=k%N;
if((k==0)||(N==1)) return ;
int[]a=new int[N];
for(int i=0;i<N;i++){
a[i]=nums[i];
}
for(int i=0;i<N-k;i++){
nums[i+k]=a[i];
}
for(int j=N-k;j<N;j++){
nums[j-N+k]=a[j];
}
}</span>
3)cost O(n) time , O(1) space,逆向思维的思路
public void rotate(int []nums,int k){
int N=nums.length;
int step=k%N;
if((step==0)||(N==1)) return ;
reverse(nums,0,N-1);
reverse(nums,0,step-1);
reverse(nums,step,N-1);
}
//reverese array element from i to j
public void reverse(int []nums,int i,int j){
while(i<j){
nums[i]^=nums[j];
nums[j]^=nums[i];
nums[i]^=nums[j];
i++;
j--;
}
}</span>