two pointers是算法编程中一种很是重要的思想,可是不多会有教材单独拿出来将,其中一个缘由是它更倾向因而一种编程技巧,而长得不太像是一个是“算法”的模样。two pointers的思想十分简介,但却提供了很是高的算法效率。算法
以一个例子引入:给定一个递增的正整数序列和一个正整数M,求序列中的连个个不一样位置的数a和b,使得它们的和刚好为M,输出全部知足条件的方案。例如给定序列{1,2,3,4,5,6}和正整数M=8,就存在2+6=8和3+5=8成立。编程
本题的一个最直观的想法是:暴力求解,使用二重循环枚举序列中的整数a和b,判断它们的和是否是M,若是是,输出方案,若是不是,则继续枚举。代码以下:spa
for(int i = 0;i < n; i ++){ for(int j = i+1; j < n; j++){ if(a[i]+a[j]==M){ cout<<a[i]<<" "<<a[j]<<endl; } } }
显然,这样作的时间复杂度是O(n^2),对n在10^5的规模时是不可承受的。code
那么根据two pointers的思想,代码以下:blog
while(i<j){ if(a[i]+a[j]==M){ cout<<a[i]<<" "<<a[j]<<endl; i++; j--; }else if(a[i]+a[j]<M){ i++; }else{ j--; } }
明显,此方法的时间复杂度为O(n),能够发现,two poin的思想慧聪分利用了递增序列的性质,以很浅显的思想下降了复杂度。class