给定一个数组,将数组中的元素向右移动 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]
第一个方法:152 ms
void rotate(vector<int>& nums, int k) { int size = nums.size(); int index = 0; k = k % size; int temp = 0; for(int i=size-k ; i<size ; ++i, ++index) { temp = nums[i]; for(int j=index + size - k ; j > index ; --j) { nums[j] = nums[j-1]; } nums[index] = temp; } }
采用库函数:
tmp = nums.back();
nums.pop_back();
nums.insert(nums.begin(), tmp);
大神方法:
对两边分别做倒转,最后再对所有倒转。
void rotate(vector<int>& nums, int k) { if (nums.size() == 0) { return; } k = k % nums.size(); reverse(nums, 0, nums.size() - k - 1); reverse(nums, nums.size() - k, nums.size() - 1); reverse(nums, 0, nums.size() - 1); } void reverse(vector<int>& nums, int start, int end) { while (start < end) { int temp = nums[start]; nums[start] = nums[end]; nums[end] = temp; ++start; --end; } }
也可以先对整个倒转,再对两边倒转
void rotate(vector<int>& nums, int k) { k = k % nums.size(); reverse(nums, 0, nums.size() - 1); reverse(nums, 0, k - 1); reverse(nums, k, nums.size() - 1); }