前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >【C++】双指针算法

【C++】双指针算法

作者头像
风中的云彩
发布2025-03-04 09:00:48
发布2025-03-04 09:00:48
2900
代码可运行
举报
文章被收录于专栏:C/C++的自学之路C/C++的自学之路
运行总次数:0
代码可运行

我们还有更长的路要走,不过没关系,道路就是生活。

前言

这是我自己学习蓝桥杯算法的第一篇博客总结。后期我会继续把蓝桥杯算法学习笔记开源至博客上。

技巧

1. 双指针算法,但实际上是利用数组下标来充当指针,并不是直接使用指针。 2. cur指针(current)扫描遍历指针左边已经扫描遍历的部分,中间及右边还未扫描遍历的部分。 3. dest指针(destination)分隔指针左边已经排好的序的部分,中间及右边还未排序的部分。 4. 划分为三个区间:[0,dest-1][dest,cur-1][cur,n-1]。 5. 双指针算法分为两类:就地操作和异地操作。 6. 异地操作需要从新创建一个数组,但不用考虑覆盖的问题。 7. 双指针算法可以从前到后遍历,又可以从后到前遍历。

例题

1. leetcode-283题283. 移动零 - 力扣(LeetCode)

代码语言:javascript
代码运行次数:0
复制
void moveZeroes(vector<int>& nums) 
{
     int cur=0,dest=0;
     while(cur<nums.size())
     {
         if(nums[cur]!=0)
         {
             swap(nums[cur],nums[dest]);
             cur++;
             dest++;
         }
         else
         {
              cur++;
         }
     }
}

2. leetcode-1089题1089. 复写零 - 力扣(LeetCode)

https://leetcode.cn/problems/duplicate-zeros/

代码语言:javascript
代码运行次数:0
复制
class Solution {
public:
    void duplicateZeros(vector<int>& arr) 
    {
        int cur=0,dest=0;
        while(dest<arr.size())
        {
            if(arr[cur]!=0)
            {
                cur++;
                dest++;
            }
            else
            {
                cur++;
                dest+=2;
            }
        }
        if(dest>arr.size())
        {
            dest=arr.size()-1;
            arr[dest]=0;
            cur-=2;
            dest--;
            while(cur>=0)
            {
                if(arr[cur]!=0)
                {
                    arr[dest]=arr[cur];
                    dest--;
                    cur--;
                }
                else
                {
                    arr[dest]=0;
                    arr[dest-1]=0;
                    dest-=2;
                    cur--;
                }
            }
        }
        else
        {
            dest=arr.size()-1;
            cur--;
            while(cur>=0)
            {
                if(arr[cur]!=0)
                {
                    arr[dest]=arr[cur];
                    dest--;
                    cur--;
                }
                else
                {
                    arr[dest]=0;
                    arr[dest-1]=0;
                    dest-=2;
                    cur--;
                }
            }
        }
    }
};

致谢

感谢您花时间阅读这篇文章!如果您对本文有任何疑问、建议或是想要分享您的看法,请不要犹豫,在评论区留下您的宝贵意见。每一次互动都是我前进的动力,您的支持是我最大的鼓励。期待与您的交流,让我们共同成长,探索技术世界的无限可能!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-03-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 技巧
  • 例题
  • 致谢
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档