<LeetCode OJ> 189. Rotate Array

189. Rotate Array

Total Accepted: 55073  Total Submissions: 278176  Difficulty: Easy

Rotate an array of n elements to the right by k steps.

For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4].

Note:
Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem.



第一种方法:

申请额外vector来处理,24ms

题目要求用三种方法
第一种:申请额外空间O(N),用vector直接处理
找规律:原数组中i位置的数据就是tmpnums中(i+k+len)/ len的数据

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
    k=k%nums.size(); //k可能大于size   
    vector<int> tmpnums(nums.size());
    for (int i=0;i<nums.size();i++)
        tmpnums[(i+k+nums.size())%nums.size()]=nums[i];
    nums=tmpnums;
    }
};


第二种方法:

技巧法(逆序),没有申请额外空间,24ms

第二种:题目意思说可以原地处理
先前面nums.size()-k个数据逆序,接着整个数组整体逆序,最后将前k个数逆序
举例:4,3,2,1,5,6,7-------》7,6,5,1,2,3,4--------》5,6,7,1,2,3,4

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
    k=k%nums.size(); 
    for (int i=0;i<(nums.size()-k)/2;i++)
        {
            int tmp1=nums[i];
            nums[i]=nums[nums.size()-k-1-i];
            nums[nums.size()-k-1-i]=tmp1;
        }
    for (int i=0;i<nums.size()/2;i++)
        {
            int tmp1=nums[i];
            nums[i]=nums[nums.size()-1-i];
            nums[nums.size()-1-i]=tmp1;
        }
    for (int i=0;i<k/2;i++)
        {
            int tmp1=nums[i];
            nums[i]=nums[k-1-i];
            nums[k-1-i]=tmp1;
        }
    }
};

或者调用库函数来做(与上面的代码完全等价),24ms:
class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        k=k%nums.size(); 
        vector<int> ::iterator ite=nums.begin();
        reverse(ite,ite+nums.size()-k);
        reverse(ite,ite+nums.size());
        reverse(ite,ite+k);
    }
};


第三种方法:

循环左移或者右移(O(N*K)超时)

class Solution {  
public:  
    void MoveRightByOne(vector<int>& nums) {  
        int temp = nums[ nums.size() - 1];  
        for (int i = nums.size() - 1; i >=1 ; --i) {  
            nums[i] = nums[i - 1];  
        }  
        nums[0]  = temp;  
    }  
   
    void MoveLeftByOne(vector<int>& nums) {  
        int temp = nums[0];  
        for (int i = 0; i < nums.size()-1 ; ++i) {  
            nums[i] = nums[i + 1];  
        }  
        nums[nums.size() - 1]  = temp;  
    }  
      
      
    void rotate(vector<int>& nums ,int k) {  
        k = k % nums.size();    
        if (k < nums.size()/2) {  
            for (int i = 0; i < k; ++i) 
                MoveRightByOne(nums);  
        } else {  
            for (int i = 0; i < nums.size()-k; ++i) 
                MoveLeftByOne(nums);  
        }  
    }  
};



注:本博文为EbowTang原创,后续可能继续更新本文。如果转载,请务必复制本条信息!

原文地址:http://blog.csdn.net/ebowtang/article/details/50449688

原作者博客:http://blog.csdn.net/ebowtang

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值