📌  相关文章
📜  从索引 K 开始反转给定循环数组的所有元素(1)

📅  最后修改于: 2023-12-03 15:36:19.658000             🧑  作者: Mango

从索引 K 开始反转给定循环数组的所有元素

问题描述

给定一个循环数组和一个索引 K,需要反转从 K 开始的所有元素。一个循环数组意味着最后一个元素的下一个元素是第一个元素。

例如,一个包含元素 [1,2,3,4,5] 的循环数组的索引 2 表示数组变为 [2,3,4,5,1]。请注意,数组中的元素不可移动或交换位置。

编写一个函数来处理这个问题,函数的原型为 void rotate(int* nums, int numsSize, int k)

解题思路

题目要求从给定的索引 K 开始反转给定循环数组的所有元素,因此可以使用双指针的方法来做。

步骤如下:

  1. 将整个数组反转,反转后的数组变为 [5,4,3,2,1]
  2. 将数组中前 K 个元素反转,反转后的数组变为 [4,5,3,2,1]
  3. 将数组中后 (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$ 为数组元素个数。