双指针算法简单介绍
双指针,又名“尺取法”,是一种经典的“小算法”,既可以单独出题(常见于笔试面试,竞赛中很少,因为比较简单),广义的双指针也可以作为其他经典算法的一部分(例如归并排序,快速排序等等)
一句话概括
双指针算法是对暴力枚举的优化,能将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:胡狸非狐
关注我,来和我一起学习技术,体悟生活,思考人生。