双指针简单学习,要学疯了

双指针简单学习,要学疯了

简单的介绍
指针非c++/c里面的指针,而是通俗地讲是所以
那么通过两个索引一起弄,就可以将同时获取两个值,或者是获取一个区间,然后再对区间里面面的数字进行判断

一些分类以及心得
// 左右指针,对于非区间的计算
// 首先是定义左右指针
// 然后就是什么情况下左动,什么情况下右动
// 当然,也有情况就是中间往两边走

// 第二种就是滑动窗口,就是题目会要求一个区间
// 或者是好几个数字,这个时候可以进行排序,
// 然后就进行一个窗口滑动,并计算
// 首先都是同向而行
// 而一般,快指针是全部遍历的,而慢指针是根据条件来进行移动的
// 视情况而定,两个指针也会一起++哦!
// 但是一般而言,是不会有两次for循环的!!!
// 就是说你的快指针不会跑好几次,就是说两个指针都只会走一次

// 最典型的例题就是n数之和
// n>2,因为n=2的时候只有两个目标,这个时候左右指针就行了
// 不需要再弄一个窗口区间出来
// 先排序,那样子,你就知道要左加还是右减
// 不然的话,你不知道减了之后下一个数字是个什么东西捏

// 三数之和是不是只是比两数多了一个数字,那么我们可以使用for循环来代替这个数字
// 酱紫我们就可以确定了一个数字,然后再比这个数字大的数字里面寻找两数之和==这个数字的负数
// 所以也就是相当于左右指针了
// 然后剩下两数就有左右指针来完成,左指针要在for循环的i之后,因为前面的都已经没处理过了
// 太牛了
// 由于i是一直向前走的,并且left和right的区间是局限在i前面的
// 所以是根本不可能存在重复的情况,因为i这个数字的位置!!!是独一无二的

//而四数之和就是类似的,再嵌套多一个循环就可以了

// 而三数之和,这道题目的话,如果是从第一个数开始制造区间,那么就有可能会少了东西捏
// 所以每一个数字都要枚举,然后作为窗口的中心,有事一种很难的想法
题目以及题解
合并两个有序数组
在这里插入图片描述
验证回文串
在这里插入图片描述
反转字符串
在这里插入图片描述
完全二叉树的权值不知道,为什么下午写的时候好像是错的,刚才提交又对了。。。奇奇怪怪
不过貌似和双指针没什么关系,注意把握跳转的量就可以了

在这里插入图片描述

int main()
{
    int len;cin >>len;
    int record[len];
    for (int i = 0; i < len; i++)
    {
        cin >>record[i];
    }
    int all=0,k=1,a=1,i=0;
    long long temp=0;
    long long res=record[0],resk=1;
    while (all<len)
    {
        temp=0;
        int flag=i;
        for (i ; i < flag+a; i++)
        {
            temp +=record[i];
            all++;
            if (all==len)
            {
                break;
            }
        }      
        if (temp>res)
        {
            res=temp;
            resk=k;
        }
        k++;
        a = a*2;
    }
    cout << resk; 
}

平方数之和直接用暴力了在这里插入图片描述
快乐数还是直接暴力了在这里插入图片描述

三数之和,但是不知道为什么编译错误了,再看看

vector<vector<int>>res;
    int n = nums.size();
    // 减少计算量
    int left,right;
    sort(nums.begin(),nums.end());
    for (int i = 0; i < n-2; i ++)
    //                      因为要保留  最后的时候,左右指针的位置
    {
        if (i&&nums[i]==nums[i-1])
        // 酱紫就除去了 0这样子左边无,无法判断的情况
        {
            continue;
        }
        if (nums[i]>0)
        // 还有000的情况哦!!!
        {
            break;
        }
        left=i+1;
        right=n-1;          
        while(left<right)
        // 要不断地进行一个移动哦!!!
        {   // 减少计算的次数,因为计算n次就会减少n次的计算!!!
            int target = nums[left]+nums[right]+nums[i];
            // ...是每一次都要重新第一捏
            // 因为while循环里面是一个双指针!!!
            if (target>0)
            {
                left--;            
            }
            else if (target<0)
            {
                right++;
            }
            else
            {
                res.push_back({nums[left],nums[right],nums[i]});
                left++;
                right--;
                // 换另外的两个数字,来算
                // 就是相当于左右指针像中间靠拢
                while (left<right&&nums[left]==nums[left-1])
                {
                    left++;
                }
                while (left<right&&nums[right]==nums[right+1])
                {
                    right--;
                }               
            } 
        }
    }

四数之和
在这里插入图片描述
期末判断
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值