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.
思路:想出尽可能多的方法,这里先写一种,以后再想其他的。
方法1:时间复杂度O(n),空间复杂度O(n - k % n)。
1 class Solution { 2 public: 3 void rotate(vector<int>& nums, int k) { 4 vector<int> tem; 5 int n = nums.size(); 6 k %= n; 7 for (int i = 0; i < n - k; i++) 8 tem.push_back(nums[i]); 9 for (int i = n - k; i < n; i++) 10 nums[i - n + k] = nums[i]; 11 for (int i = k; i < n; i++) 12 nums[i] = tem[i - k]; 13 } 14 };
方法2:将前n-k个数反转,将后k个数反转,将所有数反转。时间复杂度O(n),空间复杂度O(1).
1 class Solution { 2 public: 3 void rotate(vector<int>& nums, int k) { 4 int n = nums.size(); 5 k = k % n; 6 reverse(nums.begin(), nums.begin() + n - k); 7 reverse(nums.begin() + n - k, nums.begin() + n); 8 reverse(nums.begin(), nums.begin() + n); 9 } 10 };