📅  最后修改于: 2023-12-03 15:36:19.658000             🧑  作者: Mango
给定一个循环数组和一个索引 K
,需要反转从 K
开始的所有元素。一个循环数组意味着最后一个元素的下一个元素是第一个元素。
例如,一个包含元素 [1,2,3,4,5]
的循环数组的索引 2
表示数组变为 [2,3,4,5,1]
。请注意,数组中的元素不可移动或交换位置。
编写一个函数来处理这个问题,函数的原型为 void rotate(int* nums, int numsSize, int k)
。
题目要求从给定的索引 K
开始反转给定循环数组的所有元素,因此可以使用双指针的方法来做。
步骤如下:
[5,4,3,2,1]
。K
个元素反转,反转后的数组变为 [4,5,3,2,1]
。(numsSize-K)
个元素反转,反转后的数组变为 [4,5,1,2,3]
。最后,得到的数组即为旋转后的数组。
void reverse(int* nums, int left, int right) {
while (left < right) {
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
left++;
right--;
}
}
void rotate(int* nums, int numsSize, int k){
k %= numsSize;
reverse(nums, 0, numsSize-1);
reverse(nums, 0, k-1);
reverse(nums, k, numsSize-1);
return;
}
上述算法时间复杂度为 $O(n)$,其中 $n$ 为数组元素个数。