题目描述
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
要求使用空间复杂度为 O(1) 的 原地 算法。
思路
首先确定移动多少个,k = k % n.(移动长度有可能超过数组长度,所以求余)
- 找到下标是n-k的元素,将数组分为两半,分别反转这两部分,最后反转整个数组。
- 数组整体向右移动一位,这样做k次即可。
- 交换,左下标是0的为起始位与右下标是n-k的交换,左右向右进1,前k个都这样做,然后起始结点加k,重复上面的过程,然后起始结点右加k,直到遍历掉整个数组
思路一代码:
import java.util.*;
public class Solution {
public int[] solve (int n, int m, int[] a) {
m = m % n;
if(a.length == 0 || a.length == 1){
return a;
}
reverse(a,n-m,n-1);
reverse(a,0,n-m-1);
reverse(a,0,n-1);
return a;
}
public void reverse(int[] arr, int left, int right){
int temp ;
while(left < right){
temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
}
}
思路二代码:
import java.util.*;
public class Solution {
public int[] solve (int n, int m, int[] a) {
m = m % n;
for(int i = 0; i < m; i++){
int temp = a[n-1];
for(int j = n - 2; j >= 0; j--){
a[j+1] = a[j];
}
a[0] = temp;
}
return a;
}
}