旋转数组
将包含 n 个元素的数组向右旋转 k 步。
例如,如果 n = 7 , k = 3,给定数组 [1,2,3,4,5,6,7] ,向右旋转后的结果为 [5,6,7,1,2,3,4]。
注意:
尽可能找到更多的解决方案,这里最少有三种不同的方法解决这个问题。
[显示提示]
提示:
要求空间复杂度为 O(1)
解法一:
效率过低
void rotate(vector<int>& nums, int k) {
if(nums.empty() || k%nums.size()==0)
return;
int rk=k%nums.size();
for(int i=0;i<nums.size()-rk;++i)
{
nums.push_back(nums[0]);
nums.erase(nums.begin());
}
}
解法二:
效率较高
void rotate(vector<int>& nums, int k) {
if (nums.empty())
return;
int n = nums.size();
k = k % n;
int start = 0;
int end = n - 1 - k;
while (start < end)
swap(nums[start++], nums[end--]);
start = n - k;
end = n - 1;
while (start < end)
swap(nums[start++], nums[end--]);
reverse(nums.begin(), nums.end());
}