【算法思考】重新思考“双指针”算法(持续更新补充,关注不迷路)

双指针算法简单介绍

双指针,又名“尺取法”,是一种经典的“小算法”,既可以单独出题(常见于笔试面试,竞赛中很少,因为比较简单),广义的双指针也可以作为其他经典算法的一部分(例如归并排序,快速排序等等)

一句话概括

双指针算法是对暴力枚举的优化,能将O(nk)优化为O(nk-1),换句话说是“排除了冗余枚举”。

举个例子

在这里插入图片描述在这里插入图片描述

leetcode t11:一道双指针裸题。代码如下

class Solution {
public:
    int maxArea(vector<int>& a) {
        int res=0;
        int l=0,r=a.size()-1;
        while(l<r){
            int area=min(a[l],a[r])*(r-l);
            res=max(res,area);
            if(a[l]<a[r]) l++;
            else r--;
        }
        return res;
    }
};

复杂度上看,本来O(n2)的双重循环写法被优化到了O(n)

简单解释下就是l和r两个指针不断向中间移动并且维护最大值,为什么谁小谁往中间移动?贪心得想,假如较大的那个值对应的指针移动,根据面积=长*宽,长度减小,宽度不增,结果不会更优。

更加形式化的语言为:“把较大的那个指针往中间移动所对应的其他所有解都排除了,因为他们都比现在更差,故一定比最优解差,因此不需要再枚举这些情况了。”

题目持续更新中 loading…

全网ID:胡狸非狐

关注我,来和我一起学习技术,体悟生活,思考人生。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DataPlayerK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值