翻转法实现旋转数组

简介:记录旋转数组的一种奇妙实现方法

1.题目

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

2.思路

设原数组为{1,2,3,4,5,6,7},k=3,目标为{5,6,7,1,2,3,4,5};
首先翻转整个数组得{7,6,5,4,3,2,1};
再翻转前k个数得{5,6,7,4,3,2,1};
最后翻转坐标为[k]到[n-1]的数组得{5,6,7,1,2,3,4};

3.时空复杂度

时间复杂度:O(n);
空间复杂度:O(1);

4.code

void rotate(vector<int>& nums, int k) {
    int n=nums.size();
    //优化:k等于数组长度n时,右移k等价于不移动,故可以通对k取余来优化算法
    k=k%n;
    //整体翻转
    reverse(nums,0,n-1);
    //翻转前k个数
    reverse(nums,0,k-1);
    //翻转后面的数
    reverse(nums,k,n-1);
}
//翻转一段数组的实现
void reverse(vector<int>& nums,int start,int end){
    while(start<end){
        swap(nums[start],nums[end]);
        start+=1;
        end-=1;
    }
}
posted @ 2023-07-26 17:57  0wwlww0  阅读(75)  评论(0)    收藏  举报