📜  gfg 循环数组旋转 - C++ (1)

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

循环数组旋转 - C++

简介

循环数组旋转是一个常见的算法问题,其目的是将一个包含n个元素的数组向右旋转k个元素,其中n和k是非负整数。例如,将数组[1,2,3,4,5,6,7]向右旋转3个元素,结果为[5,6,7,1,2,3,4]。

在C++中,我们可以使用以下算法将数组旋转k个元素:

  1. 将整个数组反转
  2. 翻转前k个元素
  3. 翻转从k开始到末尾的元素
代码
void rotate(vector<int>& nums, int k) {
    int n = nums.size();
    k %= n;

    // 反转整个数组
    reverse(nums.begin(), nums.end());

    // 反转前k个元素
    reverse(nums.begin(), nums.begin() + k);

    // 反转从k开始到末尾的元素
    reverse(nums.begin() + k, nums.end());
}
解释
  1. 第一行代码中,我们对k取模,以防k的值大于n。如果k等于n,则向右旋转k个元素等于不旋转。即在这种情况下,数组不变。
  2. 我们将整个数组反转,这样原来的最后一个元素现在成为了第一个元素,第一个元素成为了最后一个元素。例如,将数组[1,2,3,4,5,6,7]反转为[7,6,5,4,3,2,1]。
  3. 接下来,我们只需要翻转前k个元素和从k开始到末尾的元素即可。这样就将数组向右旋转了k个元素。
总结

以上是C++中循环数组旋转的算法。其时间复杂度为O(n),空间复杂度为O(1)。通过此算法,程序员可以在O(n)时间内向右旋转数组中的元素。