【C++】双指针算法

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

前言 

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

技巧 

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)https://leetcode.cn/problems/move-zeroes/

void moveZeroes(vector& nums) 
{
     int cur=0,dest=0;
     while(cur

2. leetcode-1089题:  1089. 复写零 - 力扣(LeetCode)https://leetcode.cn/problems/duplicate-zeros/

class Solution {
public:
    void duplicateZeros(vector& arr) 
    {
        int cur=0,dest=0;
        while(destarr.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--;
                }
            }
        }
    }
};

致谢

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

你可能感兴趣的:(C++,c++,算法)