Rotate Array [LeetCode]

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

class Solution {
public:
    void rotate(vector<int>& nums, int k) {

//第一种方法,时间代价很大       

//   k = k % nums.size();//k可能很大

//  int temp;

//  for(int i = 0; i < k; i++)//移位k次

//  {

//      temp = nums[nums.size()-1];

//      for(int j = nums.size()-1; j > 0 ; j–)

//      {

//         nums[j] = nums[j-1];

//     }

//     nums[0] = temp;

//  }

//第二种方法,拷贝内存方式[转载]     

//int n = nums.size();

//if (k == 0) return;  

//int *temp = new int[n];  

//memcpy(temp, nums+(n-k-1), sizeof(int)*k);  

//memcpy(temp+k, nums, sizeof(int)*(n-k));  

//memcpy(nums, temp, sizeof(int)*n);  

//delete[] temp;  

//第三种方法,将后面k个数据保存在队列中

int n = nums.size();

if(n==0)return;

k=k%n;//当k大于n的时候,n次循环会回到初始位置,因此,可以省略若干次

if (k == 0) 

return;  

queue<int> s;//为了一步到位的展开移动,申请k个额外空间用于保存被移出去的元素,//需要额外空间O(k%n)

for(int i=0;i<k;++i)

{

s.push(nums[n-k+i]);

}

for(int j=n-k-1;j>=0;–j)

nums[j+k]=nums[j];//移动

for(int i=0;i<k;++i)

{

nums[i] = s.front();

s.pop();

}

}

};

点赞