https://leetcode.com/problems/rotate-array/
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]
.
最直接做法,用一个数组拷贝原始数组
void rotate(vector<int>& nums, int k)
{
int n = nums.size();
if (n == 0)
return;
k %= n;
if(k<1)
return;
int *nums2 = new int[n];
for (int i = 0; i < n;i++)
nums2[i] = nums[i];
for (int i = 0; i < k; i++)
nums[i] = nums2[n-k+i];
for (int i = k; i < n; i++)
nums[i] = nums2[i - k];
}
优化空间
void rotate(vector<int>& nums, int k)
{
int n = nums.size();
if (n == 0)
return;
k %= n;
if(k<1)
return;
int *nums2 = new int[k];
for (int i = 0; i < k;i++)
nums2[i] = nums[n - k + i];
for (int i = n-1; i >=k; i--)
nums[i] = nums[i - k];
for (int i = 0; i < k; i++)
nums[i] = nums2[i];
}
2
旋转三次
void reverse(vector<int>& nums, int l, int r)
{
int t;
while (l < r)
{
t = nums[l];
nums[l++] = nums[r];
nums[r--] = t;
}
}
void rotate(vector<int>& nums, int k)
{
int n = nums.size();
if (n == 0)
return;
k %= n;
if(k<1)
return;
reverse(nums, 0, n - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, n - 1);
}
3
每次移动一位,超时
4 参考https://leetcode.com/discuss/26501/3-lines-of-c-in-one-pass-using-swap
void rotate(vector<int>& nums, int k)
{
int n = nums.size();
if (n == 0)
return;
k %= n;
if(k<1)
return;
int j = 0,t;
for (; k %= n; n -= k)
{
for (int i = 0; i < k; i++)
{
t = nums[j];
nums[j] = nums[n - k+j];
nums[n - k + j] = t;
j++;
}
}
}