旋转数组

时间:2025-03-03 10:14:29

1. 问题描述

从右侧旋转一个n个元素的数组,旋转k位。例如: n=7,k=3 arr=[1,2,3,4,5,6,7] 旋转成为 arr=[5,6,7,1,2,3,4]


2. 方法与思路

其实这个问题类似于字符串逆置问题中的句子逆置。比如“hello world”逆置成”world hello”。解决这种问题的O(1)空间复杂的算法通常是先逆置单词,后逆置整个句子。
针对这个问题,思路一样。第一次逆置前半段[4,3,2,1,5,6,7],第二次逆置后半段[4,3,2,1,7,6,5],最后整个逆置[5,6,7,1,2,3,4]。


注意:如果k大于数组的长度,则需要 k=k%arr.len ,因为数组在旋转一圈后还是等于原来的数组。



主要过程如下:

I. for i:0arr.sizek1
逆置
II. for i:(arr.sizek)arr.size1
逆置
III. for i:0arr.size1
逆置

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int i,j;

        k = k%();

        for(i = 0,j = () - k -1; i < j; i ++,j--)
            swap(nums[i],nums[j]);
        for(i = ()-k,j = ()-1; i < j; i++,j--)
            swap(nums[i],nums[j]);

        for(i = 0,j = ()-1; i < j; i++,j--)
            swap(nums[i],nums[j]);
    }
};