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