数组旋转的三种写法
常规方法:时间复杂度为O(n*k),最坏情况下为O(n^2),空间复杂度为O(1)
向左轮换
void reverse(int* nums, int numsSize)
{
for (int i = 0; i < numsSize - 1; i++)
{
nums[i] = nums[i + 1];
}
}
void rotate(int* nums, int numsSize, int k)
{
for (int i = 0; i < k; i++)
{
int tmp = nums[0];
reverse(nums, numsSize);
nums[numsSize - 1] = tmp;
}
}
int main()
{
int nums[7] = { 1, 2, 3, 4, 5, 6, 7 };
int numsSize = sizeof(nums) / sizeof(nums[0]);
int k = 3;
rotate(nums, numsSize, k);
return 0;
}
向右轮换
void reverse(int* nums, int numsSize)
{
for (int i = numsSize - 2; i >= 0; i--)
{
nums[i + 1] = nums[i];
}
}
void rotate(int* nums, int numsSize, int k){
for (int i = 0; i < k; i++)
{
int tmp = nums[numsSize-1];
reverse(nums, numsSize);
nums[0] = tmp;
}
}
常规方法:拿空间换时间,时间复杂度为O(n),空间复杂度为O(n)
void rotate(int* nums, int numsSize, int k)
{
k %= numsSize;
int split[100000] = { 0 };
int i = 0;
for (i = 0; i < k; i++)
split[i] = nums[numsSize - k + i];
for (i = 0; i < numsSize - k; i++)
split[i + k] = nums[i];
for (i = 0; i < numsSize; i++)
nums[i] = split[i];
}
最好的方法:先n部分逆序,再n-k部分逆序,最后整体逆序,时间复杂度为O(n),空间复杂度为O(1)
void swap(int* nums, int L, int R)
{
int tmp = 0;
while (L < R)
{
tmp = nums[L];
nums[L] = nums[R];
nums[R] = tmp;
L++;
R--;
tmp = 0;
}
}
void rotate(int* nums, int numsSize, int k)
{
k %= numsSize;
swap(nums, 0, numsSize - k - 1);
swap(nums, numsSize - k, numsSize - 1);
swap(nums, 0, numsSize - 1);
}