精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

學會Two Pointers算法,玩轉(zhuǎn)LeetCode

開發(fā) 前端 算法
今天給大家聊一個非常經(jīng)典也非常簡單的算法,學會了這個算法不說能夠縱橫leetcode,但可以解決非常多的問題。并且很多其他的算法也用到了類似的思想,非常有借鑒意義。

 [[421659]]

大家好,我是梁唐。

今天給大家聊一個非常經(jīng)典也非常簡單的算法,學會了這個算法不說能夠縱橫leetcode,但可以解決非常多的問題。并且很多其他的算法也用到了類似的思想,非常有借鑒意義。

這個算法的名字叫做兩指針算法,英文名是two pointers。

算法原理

既然算法叫做two pointers,那么顧名思義必然和兩個指針有關(guān)。

首先聲明一點,這里的指針并不是傳統(tǒng)意義上的指針,可以理解成記錄位置的變量或者是標記的意思。我們用兩個變量記錄一個線性表中的兩個位置,維護這兩個位置圍成的區(qū)間。比如一個區(qū)間左側(cè)的變量叫l(wèi),右側(cè)的變量叫r,那么我們維護的就是[l, r]這個區(qū)間。

所以兩個指針的目的是為了維護區(qū)間,這也是這個算法的核心目的。所以這個算法一般的應(yīng)用場景就是尋找一個合法的最大區(qū)間的問題。當然實際的問題不會這么直白地告訴你我要求的是一個合法的區(qū)間,而是會做各種包裝,玩各種花樣,給你一些彎彎繞,需要你自己通過分析和理解get到題目的核心訴求。

理解了算法的核心目的之后,再來理解它的原理就容易多了,就只有一個問題需要解決,就是怎么樣維護區(qū)間?

我們假設(shè)現(xiàn)在的l和r都停留在了一個合法的位置,我們把[l, r]理解成一個區(qū)間,那么l和r的變化都可以看成是區(qū)間的移動。

比如,l增大,就可以看成是區(qū)間的左側(cè)在縮小。我們從[l, r]變成[l+1, r],意味著區(qū)間的左側(cè)彈出了一個元素。反過來,如果r增大,則意味著區(qū)間的右側(cè)再拓展,從[l, r]變成[l, r+1],意味著區(qū)間的右側(cè)添加了一個新元素。所以我們控制l和r的增大,就相當于控制了區(qū)間添加和刪除元素。

當我們要移動的時候,我們可以固定將r增大一位,也就是給區(qū)間添加一個元素。既然添加了新元素,就有可能導致區(qū)間的合法性被破壞。我們就需要做些什么來維護區(qū)間的合法性,比如我們可以移動左側(cè)的l,讓區(qū)間彈出元素,直到恢復合法性為止。

隨著r一位一位地移動,我們就自然地遍歷了所有合法的區(qū)間,想要找到其他最大或者最小的一個也就非常簡單了。

可能光這么看文字會有些抽象,沒關(guān)系,我們來看一道具體的例題,來套用一下剛學的這個算法。

例題

我們以leetcode第三題舉例,這題當中需要我們在一個字符串當中找到一個最長的不包含重復字符的子串。

表面上來看這是一道字符串問題,很多人思考的角度估計都會圍繞字符串展開。但實際上,我們只需要把尋找的子串看成是原字符串上的一段區(qū)間,那么這就是一個尋找最大合法區(qū)間的問題。

在這個問題當中,合法性指的是區(qū)間內(nèi)的字符各不相同。

其實已經(jīng)很明顯了,我們只要套入一下two pointers算法就行了。首先,我們初始化一個合法區(qū)間,在這道題當中,很容易想到合法區(qū)間可以是[0, 0]。之后的每一步,我們都將r向右移動一位,也就是在區(qū)間里插入一個新字符。由于新字符的插入可能會引起區(qū)間的合法性遭到破壞,也就是使得某個字符重復了。

在這種情況下,我們就移動l指針,彈出區(qū)間內(nèi)的元素,直到區(qū)間恢復合法性為止。為了判斷區(qū)間的合法性是否回復,我們需要使用一個map來存儲區(qū)間內(nèi)每個元素的個數(shù)。當新插入的字符數(shù)量大于1的時候,說明合法性遭到了破壞,直到數(shù)量恢復成1為止。

代碼

光看描述可能還有一些抽象,沒關(guān)系,我們再來結(jié)合一下代碼進行說明。

  1. class Solution { 
  2. public
  3.     int lengthOfLongestSubstring(string s) { 
  4.         map<charint> mp; 
  5.         if (s.size() == 0) return 0; 
  6.         int ret = 1; 
  7.         int l = 0; 
  8.         mp[s[0]] = 1; 
  9.         // 每次將r移動一位,插入元素 
  10.         for (int r = 1; r < s.size(); r++) { 
  11.             char c = s[r]; 
  12.             // 將s[r]插入map 
  13.             if (mp.count(c)) mp[c]++; 
  14.             else mp[c] = 1; 
  15.             // 如果map中s[r]的數(shù)量大于1,說明引起沖突 
  16.             // 彈出左側(cè)元素,直到合法性恢復 
  17.             while (mp[c] > 1) { 
  18.                 mp[s[l++]]--; 
  19.             } 
  20.             ret = max(r - l + 1, ret); 
  21.         } 
  22.         return ret; 
  23.     } 
  24. }; 

結(jié)合一下代碼注釋,整體邏輯還是比較清晰的。

就是一個右側(cè)拓展,左側(cè)收縮的過程,比較容易疑惑的點是為什么這樣能找到最大的區(qū)間?其實這里面還蘊藏著貪心法的思想,只不過比較難想到。

可以用數(shù)學歸納法簡單地進行一個證明,首先,很明顯[0, 0]是以0為右端點能夠找到的最大合法區(qū)間。

我們假設(shè)[l, r]是以r為右邊界能夠找到的最大合法區(qū)間,也就是說l是它能延伸到的最左側(cè)的位置。那么當我們將r移動到r+1,以r+1為右側(cè)邊界,往左側(cè)去尋找最大合法區(qū)間,找到的左側(cè)邊界,我們叫做l'。請問這個l'可能小于l嗎?

很顯然,不可能,因為如果l' < l,那么[l', r]必然也是合法的,就和我們假設(shè)的前提矛盾了。所以l'一定是大于等于l的。這就證明了,我們通過這樣的遞推算法找到的區(qū)間都是基于右側(cè)端點的最大合法區(qū)間,我們基于每一個可能構(gòu)成右側(cè)端點的位置都尋找了最大合法區(qū)間,全局最大合法區(qū)間也必然在其中。

優(yōu)化

如果能夠?qū)懗龌蛘呃斫馍厦娴拇a,那么對于two pointers算法的理解就算是勉強過關(guān)了,不過還沒有結(jié)束。

因為如果對于它理解足夠深入,就會發(fā)現(xiàn)這道題還有繼續(xù)優(yōu)化的空間,繼續(xù)優(yōu)化的前提依賴我們對算法的理解。

那么哪里還可以優(yōu)化呢?其實很簡單,我用紅框標記一下就知道了。

我們在維護區(qū)間合法性的時候,使用了while循環(huán)彈出左側(cè)的邊界。仔細想,我們使用while循環(huán)的目的是什么?是移動區(qū)間的左側(cè)邊界l,移動l的目的是什么?是為了維護區(qū)間合法性,那維護區(qū)間合法性的核心在哪里?在于彈出那個和s[r]相同的字符。

重點來了,為了彈出和s[r]相同的字符。我們可以想到什么?既然本質(zhì)目的是為了彈出這個引起沖突的字符,除了一位一位地移動,還有沒有其他辦法?我們既然已經(jīng)用map了,使用一下map記錄一下每個字符的位置行不行?完全可以!這樣的話,我們就把循環(huán)的若干次執(zhí)行替換成了一次查找,大大加快了速度。

如果再機靈一點,又可以想到,我們其實也沒有必要使用map,因為我們記錄的是字符的位置。字符的ascii碼范圍很小,我們完全可以用數(shù)組來存儲,這樣的話查找會更快,只有。

我們來看優(yōu)化之后的代碼:

  1. class Solution { 
  2. public
  3.     int lengthOfLongestSubstring(string s) { 
  4.         int mp[128]; 
  5.         memset(mp, -1, sizeof mp); 
  6.         if (s.size() == 0) return 0; 
  7.         int ret = 1; 
  8.         int tmp = 0; 
  9.         int l = 0; 
  10.         mp[s[0]] = 0; 
  11.         int n = s.size(); 
  12.         for (int r = 1; r < n; r++) { 
  13.             char c = s[r]; 
  14.             if (mp[c] >= l) l = mp[c]+1; 
  15.             mp[c] = r; 
  16.             ret = max(r - l + 1, ret); 
  17.         } 
  18.         return ret; 
  19.     } 
  20. }; 

我們重點看下這個部分:

如果最近的一個s[r]在l的右側(cè),說明會構(gòu)成沖突,那么我們直接把l移動到它的后一位即可,就代替了while循環(huán)一位一位移動l的操作,大大提升了運行速度。

實際上也的確如此,優(yōu)化之前用了36ms,而優(yōu)化之后只用了12ms,足足快了三倍。

這道例題非常經(jīng)典,既有two pointers的應(yīng)用,還可以基于它的理解進行進一步地優(yōu)化,能把這道題吃透,就足夠領(lǐng)會算法的精髓,并且它的難度還不是非常大,對新手足夠友好。

如果之前沒學過two pointers算法的話,可以多琢磨一下這道題,一定會有很大的收獲。

責任編輯:武曉燕 來源: Coder梁
相關(guān)推薦

2025-06-03 01:25:00

2022-05-30 08:34:49

PythonSQL

2024-06-06 09:44:33

2024-07-19 08:21:24

2024-06-03 08:09:39

2024-12-19 00:16:43

2024-08-21 08:21:45

CNN算法神經(jīng)網(wǎng)絡(luò)

2024-08-02 10:28:13

算法NLP模型

2011-09-19 13:41:54

2024-09-09 23:04:04

2022-03-04 08:17:53

PageRank網(wǎng)絡(luò)等級

2021-08-26 13:22:46

雪花算法隨機數(shù)

2024-03-28 12:20:17

2009-12-25 14:18:06

預讀算法

2022-12-09 09:21:10

分庫分表算法

2021-11-12 09:30:46

滑動窗口算法

2022-02-11 09:42:21

Swift開發(fā)語言LeetCode

2024-08-30 14:34:00

2024-12-04 10:33:17

2024-11-11 00:00:02

卷積神經(jīng)網(wǎng)絡(luò)算法
點贊
收藏

51CTO技術(shù)棧公眾號

亚洲精品中文字幕女同| 97久久超碰精品国产| 久久久999精品免费| 性久久久久久久久久久久久久| 麻豆tv免费在线观看| 国产一区二区三区免费看 | 最新国产在线观看| 国产成人综合网站| 欧美亚洲视频在线看网址| 蜜乳av中文字幕| 欧美成人精品午夜一区二区| 亚洲h在线观看| 日韩av电影免费播放| 国产夫妻自拍av| 国产麻豆综合| 日韩亚洲成人av在线| 日批在线观看视频| 亚洲色图图片| av大全在线免费看| 日本不卡视频一二三区| 欧美大片免费观看在线观看网站推荐| 少妇饥渴放荡91麻豆| 亚洲tv在线| 一道本成人在线| 成年在线观看视频| 日本电影全部在线观看网站视频| 99久久久国产精品| 91在线无精精品一区二区| 亚洲欧美综合另类| 好看的亚洲午夜视频在线| 中文字幕在线视频日韩| 国产毛片毛片毛片毛片毛片毛片| 只有精品亚洲| 欧美色倩网站大全免费| 波多野结衣之无限发射| 97超碰在线公开在线看免费| 国产成人自拍高清视频在线免费播放 | 佐佐木明希电影| 9999在线精品视频| 欧美日韩一区小说| 凹凸日日摸日日碰夜夜爽1| 日日夜夜天天综合入口| 最好看的中文字幕久久| 欧美精品一区二区三区在线四季| www.欧美国产| 国产伦精品一区二区三区视频青涩 | 精品无人码麻豆乱码1区2区 | 久久亚洲春色中文字幕久久久| 51精品国产人成在线观看| 中文字幕理论片| 国产精品美女毛片真酒店| 韩日一区二区三区| 日韩精品视频中文在线观看| 香蕉在线观看视频| 玖玖玖电影综合影院| 欧美日韩久久久久久| 国产精品天天av精麻传媒| 大菠萝精品导航| 亚洲地区一二三色| 国产3p露脸普通话对白| 爱情岛亚洲播放路线| 亚洲精品欧美激情| 日韩欧美一级在线| 色老头在线观看| 亚洲精品综合在线| 性高湖久久久久久久久aaaaa| aaa大片在线观看| 一区二区三区在线免费| 777久久精品一区二区三区无码| 国产精品扒开做爽爽爽的视频| 中文字幕欧美激情一区| 亚洲资源视频| 影音先锋男人资源在线| 亚洲一区二区偷拍精品| 97超碰在线人人| 麻豆网站免费在线观看| 欧美日韩在线视频一区二区| www.亚洲天堂网| 欧美日韩精品免费观看视欧美高清免费大片 | 九九**精品视频免费播放| 国产精品男女猛烈高潮激情| 一级片在线免费观看视频| 麻豆一区二区99久久久久| 91精品视频在线看| www.黄色国产| 久久综合九色综合欧美亚洲| 日本一区二区三区视频免费看| 免费看男男www网站入口在线| 日本一区二区三区dvd视频在线| 亚洲7777| 肉肉视频在线观看| 一本到不卡精品视频在线观看| 日韩av手机版| 精品国产一区二| 日韩h在线观看| 欧美一区二区三区粗大| 欧美a级片一区| 欧美亚洲在线观看| 国产又粗又猛又爽又黄91| 成人午夜在线播放| 天堂va久久久噜噜噜久久va| 四虎影院观看视频在线观看| 欧美视频在线免费看| 日韩 国产 一区| 亚洲三级网址| 九九热这里只有在线精品视| 久久国产视频一区| 国产一区二区三区黄视频| 久久久久久九九九九| 欧美尤物美女在线| 欧美日韩亚洲91| 日韩欧美色视频| 国际精品欧美精品| 久久久久国产精品www| 国产精品高清无码| 99re6这里只有精品视频在线观看| 亚洲日本无吗高清不卡| 九色porny丨国产首页在线| 777xxx欧美| 国产伦精品一区二区三区视频女| 国产精品v亚洲精品v日韩精品| 国产精品美女免费看| 熟妇人妻一区二区三区四区| 中文字幕永久在线不卡| 国产成人无码一二三区视频| 日韩精品久久久久久久软件91| 伊人一区二区三区久久精品| 日本网站在线免费观看| 国产老女人精品毛片久久| 色综合666| a一区二区三区| 亚洲国产欧美一区| 欧美日韩人妻精品一区二区三区| 日本中文在线一区| 欧美另类网站| 在线中文字幕播放| 亚洲国语精品自产拍在线观看| 免费在线观看一级片| 蜜桃视频免费观看一区| 欧洲久久久久久| 松下纱荣子在线观看| 亚洲电影在线观看| 精品深夜av无码一区二区老年| 美腿丝袜亚洲色图| 亚洲一区二区三区在线观看视频| 中文字幕一区久| 亚洲国产精品久久久久久| 久久精品一区二区三| 国产精品一区二区男女羞羞无遮挡 | 国产精品无圣光一区二区| 国产女大学生av| 美日韩黄色大片| 91av在线免费观看| 亚洲 欧美 激情 另类| 亚洲成人www| 男男一级淫片免费播放| 亚洲天堂黄色| 国产日韩二区| 一个人看的www视频在线免费观看 一个人www视频在线免费观看 | 四虎国产精品永久在线国在线| 在线日韩日本国产亚洲| 成年人晚上看的视频| 国产欧美日韩久久| 国产区二区三区| 国产精品久久久久久麻豆一区软件| 国产精品日韩在线| 欧美激情黑人| 欧美一级一级性生活免费录像| 69av视频在线| 成人一区二区视频| 日本一本二本在线观看| 国产在视频线精品视频www666| 国产精品视频一区二区三区四 | 乱精品一区字幕二区| 香蕉成人伊视频在线观看| 波多野结衣福利| 日韩avvvv在线播放| 99re99热| 亚洲性视频在线| 亚洲理论电影网| 欧美成人嫩草网站| 午夜先锋成人动漫在线| 九九热国产精品视频| 亚洲天堂一级片| 中文人妻av久久人妻18| 99久久国产免费| 国产91高潮流白浆在线麻豆| 国产aaa免费视频| 久久爱www成人| 成人春色激情网| 久久亚洲资源| 亚洲色图av在线| 国产美女无遮挡永久免费| 性久久久久久久久久久久| 成年人免费观看视频网站| 狠狠v欧美v日韩v亚洲ⅴ| 国产无限制自拍| 日韩av二区| 国产精品永久入口久久久| 成人精品动漫| 久久久久在线观看| 日韩子在线观看| 亚洲国产91精品在线观看| 免费在线不卡av| 午夜伦欧美伦电影理论片| 欧美人与禽zoz0善交| 国产成人av一区二区| 久久综合久久色| 国产精品激情电影| 夜夜爽99久久国产综合精品女不卡 | av激情综合网| 992kp免费看片| 日韩在线一区二区三区| 久久艹国产精品| 久久久久久美女精品| 美女亚洲精品| 一区二区三区四区视频免费观看| 国产精品久久久久久久9999| 97人人在线视频| 久久精品视频播放| 成人性生交大片免费看午夜 | 免费看毛片的网站| 国产真实精品久久二三区| 免费黄色福利视频| 亚洲人人精品| 国产精品久久久久9999爆乳| 91精品国产乱码久久久久久| 色姑娘综合网| 免费一区二区三区视频导航| 国产精选一区二区| 在线综合色站| 成人免费视频视频在| 国产精选久久| 91中文字幕在线| 在线高清欧美| 91免费在线视频| 9999在线精品视频| 国产一区私人高清影院| 中文字幕日本一区二区| 日本亚洲精品在线观看| 欧美aa在线| 欧美亚洲成人xxx| 深夜av在线| 91极品女神在线| 欧美激情20| 欧美专区中文字幕| 日本成人三级电影| 国产成人精品久久二区二区91| 男人舔女人下部高潮全视频 | 日韩女优毛片在线| 国产精品熟女久久久久久| 欧美另类一区二区三区| 一区二区美女视频| 欧美一区二区三区四区五区| 国产日韩在线观看一区| 日韩欧美资源站| 黄色一级a毛片| 日韩av一区二区在线观看| 天堂av在线免费观看| 日韩成人高清在线| 国产小视频免费在线观看| 国产性色av一区二区| 91这里只有精品| www.色综合| 色呦呦久久久| 欧美亚洲在线视频| 成人在线观看免费播放| 91在线高清视频| 99国产精品免费网站| 久久国产精品一区二区三区| 亚洲自拍电影| 这里只有精品66| 激情五月***国产精品| 日韩中文字幕在线视频观看| 久久午夜av| 91看片破解版| 风间由美中文字幕在线看视频国产欧美 | 亚洲视频自拍偷拍| 高清在线观看av| 久久综合伊人77777| av在线私库| 日韩av成人在线| 99久久这里有精品| 国严精品久久久久久亚洲影视| 亚洲欧洲av| 日本精品免费视频| 国产精品久久久久久久久久妞妞| 男女男精品视频站| 成人午夜av影视| 五月天精品在线| 午夜激情久久久| 亚洲一卡二卡在线| 日韩av网站导航| 国精产品一区| 国产91九色视频| 77成人影视| 性刺激综合网| 国产日本精品| 色姑娘综合天天| 国产欧美一二三区| 久久久久99精品成人片毛片| 在线免费观看日本欧美| 性欧美18一19性猛交| 亚洲人成网站免费播放| 国产蜜臀一区二区打屁股调教| 国产精品免费久久久久影院 | 欧美中文娱乐网| 欧美天堂亚洲电影院在线观看| 成人在线观看黄| 成人免费视频网站在线观看| 性少妇xx生活| 日韩欧美亚洲范冰冰与中字| 午夜精品久久久久久久99 | 久久伊99综合婷婷久久伊| 久久福利小视频| 亚洲美女一区二区三区| 国产黄网在线观看| 亚洲第一区在线观看| 成年人黄视频在线观看| 国产精品黄色av| 日韩激情毛片| 九九热只有这里有精品| 国产在线精品不卡| 亚洲色图欧美色| 91高清视频免费看| 日本一卡二卡四卡精品| 国语自产在线不卡| 一区二区三区四区高清视频| 四虎免费在线观看视频| 美女尤物国产一区| 性欧美一区二区| 欧美日韩国产色| 天天综合在线视频| 高清一区二区三区四区五区| 伊人久久大香线蕉综合影院首页| 亚洲精品日韩在线观看| 日韩av中文字幕一区二区| 在线免费观看麻豆| 狠狠色噜噜狠狠狠狠97| 男人的天堂a在线| 久久久女女女女999久久| ady日本映画久久精品一区二区| 日韩视频一二三| 国产一区在线观看视频| 日本黄色片免费观看| 制服丝袜在线91| 国产美女av在线| 亚洲一区二区三区xxx视频| 91精品福利| 四虎1515hh.com| 亚洲精品你懂的| a级片免费观看| 欧美激情va永久在线播放| 成人性生交大片免费看中文视频| 996这里只有精品| 成人免费毛片嘿嘿连载视频| 日韩欧美亚洲一区二区三区| 亚洲激情视频在线| 99色在线观看| 牛人盗摄一区二区三区视频| 久热国产精品| 男人晚上看的视频| 日韩三级高清在线| 77thz桃花论族在线观看| 久久精品国产一区二区三区日韩 | 亚洲天堂免费看| 精品久久人妻av中文字幕| 欧美极品少妇xxxxⅹ喷水| 婷婷综合一区| 一本色道久久亚洲综合精品蜜桃| 亚洲日本成人在线观看| 亚洲免费视频网| 国产成人黄色av| 仙踪林久久久久久久999| 91精产国品一二三| 欧美日韩激情视频| 9色在线视频| 北条麻妃高清一区| 噜噜噜91成人网| 中日韩一级黄色片| 日韩黄色高清视频| 福利一区二区| 久艹在线免费观看| 欧美国产精品一区| 国产小视频免费观看| 国产成人高清激情视频在线观看 | 欧美成人高清视频| 欧美中文一区| 亚洲欧美日本一区二区| 激情懂色av一区av二区av| yw193.com尤物在线| 动漫一区二区在线| 日韩精品一区第一页| 在线免费日韩av| 亚洲欧美在线x视频| 欧美经典影片视频网站| 欧美精品99久久久**| 亚乱亚乱亚洲乱妇| 久久青青草综合| 国产高清在线精品|