【初级算法】3.旋转数组

题目如下:

给定一个数组,将数组中的元素向右移动 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.每次向右旋转,一个数据,旋转K次即可。算法的时间复杂度为O(n)。代码如下:

python:

 void leftShift(vector<int>& nums){
        int tmp = nums[nums.size()-1];
        for(int i = nums.size()-1;i >=1;--i){
            nums[i] = nums[i-1];
        }
        nums[0] = tmp;
    }
    
    void rightShift(vector<int>& nums){
         int tmp = nums[0];
        for(int i = 0;i < nums.size()-1;++i){
            nums[i] = nums[i+1];
        }
        nums[nums.size()-1] = tmp;
    }
    
    void rotate(vector<int>& nums, int k) {
        k = k%nums.size();
        
        for(int i = 0; i < k; ++i){
            leftShift(nums);
        }
        
        return;
    }

2.数组全部反转,然后再依次反转前k个数据和最后n-k个数据:

代码如下:

C++:

void rotate(vector<int>& nums, int k) {
        k = k%nums.size();
        std::reverse(nums.begin(),nums.end());
        std::reverse(nums.begin(),nums.begin()+k);
        std::reverse(nums.begin()+k,nums.end());
        
        return;
    }

 

posted @ 2018-05-02 17:53  且听疯吟吖  阅读(3082)  评论(0编辑  收藏  举报