欢迎来到 s a y − f a l l 的文章 欢迎来到say-fall的文章 欢迎来到say−fall的文章

🌈这里是say-fall分享,感兴趣欢迎三连与评论区留言 🔥专栏: 《C语言从零开始到精通》 《C语言编程实战》 《数据结构与算法》 《小游戏与项目》 💪格言:做好你自己,你才能吸引更多人,并与他们共赢,这才是你最好的成长方式。
前言:
今天给大家带来一个轮转数组的题目
文章目录
正文:
轮转数组
- 思路一:先提取最后一个元素然后依次右移,循环k次:
c
void rotate(int* nums, int numsSize, int k)
{
k %= numsSize;//让k对numsSize取模
while (k--)//循环k次
{
int tmp = nums[numsSize - 1];//先把最后一个元素提取出来
for (int i = numsSize - 2;i >= 0;i++)
{
nums[i + 1] = nums[i];
}
nums[0] = tmp;
}
return nums;
}
- 时间复杂度:O(n^2)
- 本来可以理解为O(n*k) ,但是k取最坏情况是n-1,这样的话可以理解为是O(n^2)
- 思路二:三次反转法
思路来源:
- 对于这个题来说,移动k次,则后k个数可以看作是一组,就他们直接拿到前面去,前面的移动到后面来,顺序没变
- 那假设[1,2,3,4,5,6,7]移动3次就变成了[5,6,7,1,2,3,4]
- 我们可以看作是
①所有元素反转一次[7,6,5,4,3,2,1]
②两组元素各反转一次[5,6,7,1,2,3,4]
这样就理所当然的轮转完成了
c
void reserve(int* nums, int left, int right)
{
while (left < right)
{
int tmp = nums[right];
nums[right] = nums[left];
nums[left] = tmp;
left++;
right--;
}
}
void rotate(int* nums, int numsSize, int k)
{
k %= numsSize;
reserve(nums, 0, k - 1);
reserve(nums, k, numsSize - 1);
reserve(nums, 0, numsSize - 1);
}
- 三次反转法是更高效的实现方式,时间复杂度为 O (n) ,空间复杂度为 O (1)。
- 本节完...
