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.
Related problem: Reverse Words in a String II
自己写的需要o(k)的置换空间
class Solution { public: void rotate(vector<int>& nums, int k) { int tmp; int n = nums.size(); if (n <= 1) return ; k = k % n; vector<int> v(k); for (int i = n - 1; i > n - k - 1; --i) { v[n - 1 - i] = nums[i]; } for (int i = n - 1; i >= 0; --i) { if (i - k >= 0) nums[i] = nums[i - k]; else nums[i] = v[k - i - 1]; } } };
其他人的写法。真的是太妙了
class Solution { public: void rotate(vector<int>& nums, int k) { int n = nums.size(); if (n <= 1) return ; k = k%n; reverse(nums.begin(), nums.end()); reverse(nums.begin(), nums.begin() + k); reverse(nums.begin() + k, nums.end()); } };
reverse()函数处理参数左闭右开