😶🌫️😶🌫️😶🌫️😶🌫️Take your time ! 😶🌫️😶🌫️😶🌫️😶🌫️
💥个人主页:🔥🔥🔥大魔王🔥🔥🔥
💥所属专栏:🔥魔王的修炼之路–数据结构🔥
如果你觉得这篇文章对你有帮助,请在文章结尾处留下你的点赞👍和关注💖,支持一下博主。同时记得收藏✨这篇文章,方便以后重新阅读。
一、189. 轮转数组
点我有惊喜!!!
思路
前面有篇博客就是专门讲解这道题的:点我有惊喜!带你玩转字符串旋转问题所以这里就只写最优的方案,也就是空间复杂度为O(1),这个写法的思路需要知道一个技巧:如果是字符串左旋,那么规律就是,假设左旋n个元素,(eg:12345 左旋3个,那么就会变成45123)那么规律就是让前n个倒置,让剩下的倒置,然后再让改变后的字符串整体倒置,我们把这个方法用到上面这个例子:先让前三个倒置:123->321,剩下的倒置:45->54,那么这个字符串就变成了32154,然后我们让整体倒置就变成了45123,和上面的结果是一样的。
但是这一题是右旋,那么我们只需要略微改一下就OK了,假设一共num个数字,当右旋一个的时候,它其实就等价于左旋num-1个。
那么现在就剩下最后一个问题了,那就是倒置,我们用到了多次倒置,所以为了避免重复,复杂,我们把倒置封装成一个函数,每次用的时候直接传参。
实现方法:因为空间复杂度为O(1),所以我们用的是指针,我们每次用倒置函数时只需要传首位地址就好了,然后让它们进去对应交换,然后再调整指针指向另一个位置,具体如代码所示:
代码
void reverse(int* nums,int begin,int end)
{
while(begin<end)
{
int tep = 0;
tep = nums[begin];
nums[begin] = nums[end];
nums[end] = tep;
begin++;
end--;
}
}
void rotate(int* nums, int numsSize, int k){
k = k % numsSize;
k= numsSize - k;
reverse(nums,0,k-1);
reverse(nums,k,numsSize-1);
reverse(nums,0,numsSize-1);
}
- 博主长期更新,博主的目标是不断提升阅读体验和内容质量,如果你喜欢博主的文章,请点个赞或者关注博主支持一波,我会更加努力的为你呈现精彩的内容。
🌈专栏推荐
😈魔王的修炼之路–C语言
😈魔王的修炼之路–数据结构初阶
😈魔王的修炼之路–C++
😈魔王的修炼之路–Linux
更新不易,希望得到友友的三连支持一波。收藏这篇文章,意味着你将永久拥有它,无论何时何地,都可以立即找到重新阅读;关注博主,意味着无论何时何地,博主将永久和你一起学习进步,为你带来有价值的内容。