设计一个算法,将含有 n 个整数元素的数组 a[0..n-1]循环右移 m 位。要求算法的空间复杂度为 O(1)。java
时间: 2024-10-28 19:07:54 浏览: 32
设计一个满足 O(1) 空间复杂度的算法来实现数组的循环右移操作,可以利用原地操作的思想。以下是 Java 中的一种解决方案:
```java
public class RotateArray {
public void rotate(int[] nums, int k) {
if (nums == null || nums.length == 0 || k == 0) return;
// 获取k模数组长度,因为一次移动可能会超过一圈
k = k % nums.length;
// 双指针法,一个指针从头开始向后移动k个位置,另一个指针从尾部向前移动,直到两个指针相遇
int left = 0, right = nums.length - 1;
while (left < right) {
// 交换两个指针指向的元素
swap(nums, left, right);
// 指针向中心靠拢
left++;
right--;
}
}
private void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
```
在这个算法中,我们首先检查基本情况(空数组、零位移),然后计算实际需要旋转的位数。接着使用两个指针,一个从数组头部开始,每次移动一位,另一个从尾部开始,每次移动一步。当两个指针相遇时,我们就完成了循环右移的操作。整个过程只涉及到固定数量的变量,所以空间复杂度是 O(1)。
阅读全文