本次例题为leetcode中的题目,做题链接附上:力扣
目录
1.将尾数保存,所有值从前向后覆盖,再将首值替换为保存的那个值
题干如下:
并且后面还有进阶内容:
这里我们用三种方法来解决它。
1.将尾数保存,所有值从前向后覆盖,再将首值替换为保存的那个值
分析图解:
代码如下:
void rotate(int* nums, int numsSize, int k){
k = k%numsSize;
for (int i = 0; i<k; i++)
{
int num = nums[numsSize - 1];
for (int j = numsSize - 1; j>0; j--)
{
nums[j] = nums[j - 1];
}
nums[0] = num;
}
}
结果:超出时间限制,leetcode过不了
2.额外开数组
图解分析:
代码如下:
void rotate(int* nums, int numsSize, int k){
//创建一个数组
int*nums1 = (int*)malloc(numsSize*sizeof(int));
k = k%numsSize;
//将后k个值直接放入新数组的前k个中
int a = k;
for (int i = numsSize; i>numsSize - k; i--)
{
nums1[a - 1] = nums[i - 1];
a--;
}
//将前面的值放入新数组的后面
int b = 0;
for (int j = k; j<numsSize; j++)
{
nums1[j] = nums[b];
b++;
}
//将新数组替换为原数组
for (int c = 0; c<numsSize; c++)
{
nums[c] = nums1[c];
}
}
3.三趟逆置
图解分析:
代码如下:
void rotate(int* nums, int numsSize, int k){
k = k%numsSize;
//对n-k个进行逆置
int left = 0;
int right = numsSize - k - 1;
while (left<right)
{
int temp = nums[right];
nums[right] = nums[left];
nums[left] = temp;
left++;
right--;
}
//对后k个进行逆置
left = numsSize - k;
right = numsSize - 1;
while (left<right)
{
int temp = nums[right];
nums[right] = nums[left];
nums[left] = temp;
left++;
right--;
}
//对整体进行逆置
left = 0;
right = numsSize - 1;
while (left<right)
{
int temp = nums[right];
nums[right] = nums[left];
nums[left] = temp;
left++;
right--;
}
}
总结
从三种方法的空间复杂度和时间复杂度来看:
第一种时间复杂度为O(n^2),空间复杂度为O(1),做题时不建议使用,时间超出限制。
第二种时间复杂度为O(n),空间复杂度为O(n),可以跑过去。
第三种时间复杂度为O(n),空间复杂度为O(1),三趟逆置法为最优解。