• c语言:解决数组元素右旋问题,时间复杂度O(N)


    题目:

    给一个数组,如【1,2,3,4,5,6,7】,k=3。

    要求得到新数组【5,6,7,1,2,3,4】。


     方法一,思路和代码:

    1. void rotate(int* nums, int numsSize, int k)
    2. {
    3. while (k)
    4. {
    5. int tmp = nums[numsSize - 1];//创建一个临时变量存放最后一个数
    6. for (int end = numsSize - 2; end >= 0; --end)//循环数组元素个数的n-1次,因为最后一个数要前置,不用管
    7. {
    8. nums[end + 1] = nums[end];//后一个数被前一个数替代,n-1个数右移一次
    9. }
    10. nums[0] = tmp;//将最后一个数放在首元素的位置
    11. k--;//循环k次
    12. }
    13. }

    方法二,思路: 

    1. //方法二(时间复杂度:O(N),空间复杂度:O(N))
    2. //以空间换时间,再创建一个数组,存放要右旋的变量。
    3. //举例说明:【1,2,3,4,5,6,7】,右旋三
    4. //将后三个(k个),存放在一个数组中,【5,6,7】,再右移动四个数的位置(n-k)【1,2,3,4】
    5. //也就成了【5,6,7,1,2,3,4】(这个方法比较简单好想,这里不做代码展示)

    方法三,思路和代码(最牛): 

    1. //方法三(牛),时间复杂度和空间复杂度都最小
    2. //思路:1.后k个逆置
    3. // 2.前n-k个逆置
    4. // 3.最后整体逆置
    5. //如【1,2,3,4,5,6,7】,k=3
    6. //1.【1,2,3,4,7,6,5】
    7. //2.【4,3,2,1,7,6,5】
    8. //3.【5,6,7,1,2,3,4】
    9. void Reverse(int* nums, int left, int right)//逆置代码
    10. {
    11. while (left < right)
    12. {
    13. int tmp = nums[left];
    14. nums[left] = nums[right];
    15. nums[right] = nums[left];
    16. left++;
    17. right--;
    18. }
    19. }
    20. void rotate(int* nums, int numsSize, int k)
    21. {
    22. if (k >= numsSize)//当k大于数组长度时,对k%数组长度,取余,例如k=13,numsSize=7,k=6和k=13是一样的,但不取余的话会运行出错
    23. {
    24. k %= numsSize;
    25. }
    26. Reverse(nums, numsSize-k, numsSize - 1);//后面逆置
    27. Reverse(nums, 0, numsSize -k-1);//前面逆置
    28. Reverse(nums, 0, numsSize - 1);//整体逆置
    29. }

  • 相关阅读:
    Notepad++安装插件和配置快捷键
    用C++编写一个简单的发布者和订阅者
    OpenJudge NOI 2.1 2673:比赛排名
    keil报错:main.c(99): error: #20: identifier “xxx“ is undefined
    RK3399 Android7.1电脑端adb devices检测不到设备
    利用霍夫变换进行车道线检测
    anaconda安装python 3.11
    Llama.cpp工具main使用手册
    客户突然不回复总是有原因的!
    elasticsearch命令大全
  • 原文地址:https://blog.csdn.net/2303_80025768/article/details/134369876