leetcode【数组】-----189.Rotate Array(旋转数组)

版权声明: https://blog.csdn.net/zl6481033/article/details/88535759

1、题目描述

2、分析

        给定一个数组,将数组中的元素向右移动 个位置,其中 是非负数。

        这道题最容易想到的是复制一个一样的数组,然后根据需要移动的位置更改原数组的值。但是这样的空间复杂度是O(n)。所以我们需要想别的办法,有一个很巧妙的办法就是,使用STL里面的push_back()和erase()函数,将数组的第一个数插入到数组的最后,再将第一个数删除。这样循环的次数就是,数组的大小减去移动的位置。还有一个注意的问题是,如果移动的位置数对数组的大小取余等于0的话,那么其实就可以直接返回,因为在移动了这么多位置之后,数组的顺序是没有变化的。同理,我们可以对k进行简化,如果k值大于数组的size,那么如果不对k进行处理可能会出现错误。所以,当k大于数组大小时,将k的值设置为k对数组大小取余。这样不仅避免错误也能简化循环次数。

3、代码

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        if(nums.empty()||(k%=nums.size())==0) return ;
        int k2=k%nums.size();
        int n=nums.size();
        for(int i=0;i<n-k2;i++){
            nums.push_back(nums[0]);
            nums.erase(nums.begin());
        }
       
    }
};

4、相关知识点

        有时候使用STL自带的函数可以简化很多问题。需要熟悉STL。

猜你喜欢

转载自blog.csdn.net/zl6481033/article/details/88535759