关于Two pointers的个人理解
剛剛在刷題的時(shí)候接觸到了一道題,題的大意是給出一個(gè)遞增的數(shù)字序列,并給出一個(gè)m,要求找到a,b兩個(gè)數(shù)字,且和為m,并且a<b;
在示例中,給出了三種思路,二分、hash值、以及two pointers;
最后一種并沒(méi)有接觸過(guò),所以去了解了一下,發(fā)現(xiàn)是很值得借鑒的思路;
two pointers思想是對(duì)有序數(shù)組的優(yōu)化遍歷;
如果根據(jù)題目中的思想,進(jìn)行兩層枚舉,則不可避免地會(huì)使時(shí)間復(fù)雜度到達(dá)O(n^2)級(jí)別。但是可以針對(duì)序列遞增這一條進(jìn)行優(yōu)化;
對(duì)這個(gè)有序序列,設(shè)定兩個(gè)索引坐標(biāo),一個(gè)為i,一個(gè)為j分別從隊(duì)頭和隊(duì)尾進(jìn)行向中間枚舉,枚舉的邊界條件是i<j;
在枚舉過(guò)程中,必定會(huì)出現(xiàn)三種情況:
在此時(shí)注意一個(gè)前提條件:i必須保持增加狀態(tài),j必須保持減小狀態(tài);
1.a+b=m,此時(shí)是我們想得到的情況,并且該情況發(fā)生時(shí),如果i增大,j減小,則a+b可能和不變;
2.a+b>m,此時(shí),在前提條件規(guī)范下,我們可以推斷如果b減小,也就是j減小,可以預(yù)測(cè)會(huì)出現(xiàn)a+b=m的情況;
3.a+b<m,此時(shí),在前提條件規(guī)范下,我們可以推斷,如果a增大,也就是i增大,可能會(huì)出出現(xiàn)a+b=m的情況;
因此,將上述判別寫(xiě)成代碼可以有以下結(jié)果:
這種方法可以看成是一種取巧的方法,但是其最大的特點(diǎn)是有效的減少了時(shí)間復(fù)雜度,在遞增序列的前提下,循環(huán)只需要進(jìn)行到i>=j時(shí)停止,所以理想狀態(tài)下只需要遍歷半個(gè)序列,時(shí)間復(fù)雜度只需要O(n),所以算得上求解的一種好方法;
總結(jié)
以上是生活随笔為你收集整理的关于Two pointers的个人理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 1019 数字黑洞 (20 分)java
- 下一篇: Scrapy 框架 中间件,信号,定制