旋转数组

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

示例 1:

输入:[1,2,3,4,5,6,7]和k= 3输出:[5,6,7,1,2,3,4]解释:向右旋转 1 步:[7,1,2,3,4,5,6]向右旋转 2 步:[6,7,1,2,3,4,5]向右旋转 3 步:[5,6,7,1,2,3,4]

示例 2:

输入:[-1,-100,3,99]和k= 2输出:[3,99,-1,-100]解释:向右旋转 1 步: [99,-1,-100,3]向右旋转 2 步: [3,99,-1,-100]

说明:

尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。

要求使用空间复杂度为 O(1) 的**原地 **算法。

1.设置交换函数swap(vector& nums,int a,int b),实质是交换nums中a/b的数字a++/b--(a~b间从外到内依次交换)。因此将需要旋转的分隔开,分别交换后整体交换一遍可得旋转数组。

class Solution {

public:

    void rotate(vector& nums, int k) {

        if(nums.size()<=0)

            return;

        int nk=k%nums.size();

        int middle=nums.size()-nk;

        swap(nums,0,middle-1);

        swap(nums,middle,nums.size()-1);

        swap(nums,0,nums.size()-1);

    }

    void swap(vector& s,int a,int b){

        while(a
image.png

2.这个emmm,速度虽然快,但占用了额外空间,不符合题目说明2

classSolution{public:

    void rotate(vector& nums,intk){

        if(nums.size()==0)

            return;

        k=k%(nums.size());

        vectortem;

        for(int i=k;i>0;i--){

            tem.push_back(nums[nums.size()-i]);

        }

        for(int i=0;i

你可能感兴趣的:(旋转数组)