当前位置:   article > 正文

优选算法 ─── 双指针(1)

优选算法 ─── 双指针(1)

说明:本栏目博客讲解我认为较为优秀的算法思想,希望也能帮到大家,顶峰相见。

第一道题:移动零

思路解析:

        本题要求就地将0移到后面,也就是将非零的元素移到前面,因此可以采用双指针法

dest指针代表已经处理过的最后一个位置(从正方向一般都是-1)

cur指针遍历数组(从正方向一般是0)

而这道题不用指针用数组下标即可

代码实现:

  1. void moveZeroes(int* nums, int numsSize)
  2. {
  3. int cur=0;
  4. int dest =-1;
  5. //
  6. while(cur< numsSize)
  7. {
  8. if(nums[cur]!=0)
  9. {
  10. ++dest;
  11. int tmp=nums[cur];
  12. nums[cur]=0;
  13. nums[dest]=tmp;
  14. }
  15. ++cur;
  16. }
  17. }

第二道题:复写零

思路讲解:

        这道题如果从开头进行原地复写便会将下面的有效数据覆盖,从而从队尾写起,但要先确定从队尾的哪个开始写起,巧妙运用双指针的方法。

注意:找最后一个要写的数时dest有两种位置,要去先处理一下。

代码实现:

  1. class Solution {
  2. public:
  3. void duplicateZeros(vector<int>& arr)
  4. {
  5. int cur=0;
  6. int dest=-1;
  7. int n =arr.size();
  8. //先找到最后一个要写的数
  9. while(cur< n)
  10. {
  11. if(arr[cur])
  12. {++dest;}
  13. else
  14. {dest+=2;}
  15. if(dest>= n-1) break;//dest>=n-1就结束了
  16. ++cur;
  17. }
  18. //处理dest>end的情况
  19. if(dest == n)
  20. {
  21. --cur;
  22. arr[n-1]=0;
  23. dest-=2;
  24. }
  25. while(cur>=0)
  26. {
  27. if(arr[cur])
  28. {
  29. arr[dest--]= arr[cur--];
  30. }
  31. else
  32. {
  33. arr[dest--]=0;
  34. arr[dest--]=0;
  35. --cur;
  36. }
  37. }
  38. }
  39. };

这个博客如果对你有帮助,给博主一个免费的点赞就是最大的帮助

欢迎各位点赞,收藏和关注哦

如果有疑问或有不同见解,欢迎在评论区留言哦

后续我会一直分享双一流211西北大学软件(C,数据结构,C++,Linux,MySQL)的学习干货以及重要代码的分享

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/762376
推荐阅读
相关标签
  

闽ICP备14008679号