问题描述:
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
说明:
- 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
- 要求使用空间复杂度为 O(1) 的 原地 算法。
题目来源:旋转数组
审题
- 关键字:旋转、原地
思路
- 题目提示使用旋转
- 旋转:将两端的数互换位置再向内部逼近,从而将数组旋转
- 将数组下标为n-k到n-1的数做旋转操作
- 再将数组下标为0到n-k-1的数做旋转操作
- 最后将整个数组旋转
代码
class Solution {
public void rotate(int[] nums, int k) {
int n = nums.length;
k = k % n;
if (nums.length < 2 || nums == null || k == 0)
return;
localrotate(nums, 0, n - k - 1);
localrotate(nums, n - k, n - 1);
localrotate(nums, 0, n - 1);
}
public static void localrotate(int[] arr, int i, int j) {
while (i<j){
swap(arr,i++,j--);
}
}
public static void swap(int[] arr, int i, int j) {
int a = arr[i];
arr[i] = arr[j];
arr[j] = a;
}
}
注: 以上代码不是最优解,如果你有更好的想法,快去尝试吧!