轮转数组
1°题目链接
2°思路
思路1:暴力求解,旋转K次
时间复杂度:O(N*K) 空间复杂度O(1)时间复杂度过高 不考虑 LeetCode无法通过
思路2:开辟额外空间
时间复杂度:O(N) 空间复杂度:O(N)
思路3:
前n-k个逆置
后k个逆置
整体逆置
接下来实现思路3 比如说:
逆置代码如何实现?
找到左下标和右下标 也就找到了对应元素
再进行交换 左下标++ 右下标--
直到左右下标相等或者左下标大于右下标
3°实现
void Reverse(int* nums, int left, int right)
{
while (left < right)
{
int tmp = nums[left];
nums[left] = nums[right];
nums[right] = tmp;
++left;
--right;
}
}
void rotate(int* nums, int numsSize, int k)
{
//如果k超过n k%n 因为当k==n的时候就是原来的数组
if (k >= numsSize)
k %= numsSize;
//前n-k个数逆置
Reverse(nums, 0, numsSize - k - 1);
//后k个逆置
Reverse(nums, numsSize - k, numsSize - 1);
//整体逆置
Reverse(nums, 0, numsSize - 1);
}
//k==n时 不旋转就是要的结果
4°运行结果
#2轮转数组#完