two pointers


  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,如果是,輸出方案,如果不是,則繼續枚舉。代碼如下:

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的規模時是不可承受的。

  那么根據two pointers的思想,代碼如下:

  

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的思想慧聰分利用了遞增序列的性質,以很淺顯的思想降低了復雜度。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM