189. 轮转数组 - 力扣(LeetCode)https://leetcode.cn/problems/rotate-array/description/
1、题目简介
void rotate(int* nums, int numsSize, int k) {
}
- 尽可能想出更多的解决方案,至少有 三种 不同的方法可以解决这个问题。
- 你可以使用空间复杂度为
O(1)
的 原地 算法解决这个问题吗?
2、思路1
先写一段代码实现轮转1次,再循环k次
void Rotate(int* nums, numsSize, int k)
{
while(k)
{
//最后一个元素存起来, 其他所有元素后移一位
int tmp = nums[numsSize-1];
int i = 0;
for (i = numsSize - 2; i >= 0; i--)
{
nums[i+1] = nums[i];
}
nums[0] = tmp;
k--;
}
}
可惜时间超限了~
时间复杂度为 O(n^2) 空间复杂度为O(1)
3、思路2
void reverse(int* nums, int start, int end)
{
while (start < end)
{
int tmp = nums[start];
nums[start] = nums[end];
nums[end] = tmp;
start++;
end--;
}
}
void rotate2(int* nums, int numsSize, int k)
{
//避免end为负值造成越界访问
if (k > numsSize)
{
k %= numsSize;
}
//旋转次数等于数组长度的时候不需要变化了
if (k == numsSize)
{
return;
}
reverse(nums, 0, numsSize - k - 1);
reverse(nums, numsSize - k, numsSize - 1);
reverse(nums, 0, numsSize - 1);
}
3、思路3
memove要记清楚(目标, 源头, 字节数)
void rotate(int* nums, int numsSize, int k)
{
if (k > numsSize)
{
k %= numsSize;
}
if (k == numsSize)
{
return;
}
int* arr = (int*)malloc(sizeof(int) * numsSize);
memmove(arr, nums + numsSize - k, k * sizeof(int));
memmove(arr + k, nums, (numsSize - k) * sizeof(int));
memmove(nums, arr, numsSize * sizeof(int));
free(arr);
arr = NULL;
}