思路:
方法一:每次移动1个元素,移动n次,时间复杂度O(n*k),空间复杂度O(1),会超时;
void rotate(vector<int> &nums, int k) {
int len = nums.size();
k %= n;
for (int i = 0; i < k; i++) {
int temp = nums[n - 1];
for (int j = n - 1; j > 0; j--) {
nums[j] = nums[j - 1];
}
nums[0] = temp;
}
}
方法二:翻转3次,比如1234567 k=3
翻转一次7654321
然后翻转前k个元素,得到5674321
,然后翻转后面len-k个元素,得到7654321
即可;
void fanzhuan(vector<int> &nums, int s, int e)
{
int dist = 0;
for (int i = s; i <= (s + e) / 2; i++)
{
int temp = nums[i];
nums[i] = nums[e - dist];
nums[e - dist] = temp;
dist++;
}
}
void rotate(vector<int> &nums, int k)
{
int len = nums.size();
if (len <= 1 || k == 0)
return;
if (k > len)
k = k & len;
fanzhuan(nums, 0, len - 1);
fanzhuan(nums, 0, k - 1);
fanzhuan(nums, k, len - 1);
}