指標 是否相同 演算法 雙指標套路總結

2021-10-14 20:13:11 字數 1191 閱讀 2335

雙指標是一種思想,一種技巧或一種方法,並不是什麼特別具體的演算法,在二分查詢等演算法中經常用到這個技巧。具體就是用兩個變數動態儲存兩個或多個結點,來方便我們進行一些操作。通常用在線性的資料結構中,比如鍊錶和陣列,有時候也會用在圖演算法中。

在我們遇到像陣列,鍊錶這類資料結構的演算法題目的時候,應該要想得到雙指標的套路來解決問題。特別是鍊錶類的題目,經常需要用到兩個或多個指標配合來記憶鍊錶上的節點,完成某些操作。鍊錶這種資料結構也是樹形結構和圖的原型,所以有時候在關於圖和樹形結構的演算法題目中也會用到雙指標。

當你遇到此類資料結構,嘗試使用雙指標來解題的時候,可以從以下幾個雙指標類題目的套路入手進行思考

類似於龜兔賽跑,兩個鍊錶上的指標從同一節點出發,其中乙個指標前進速度是另乙個指標的兩倍。利用快慢指標可以用來解決某些演算法問題,比如

計算鍊錶的中點:快慢指標從頭節點出發,每輪迭代中,快指標向前移動兩個節點,慢指標向前移動乙個節點,最終當快指標到達終點的時候,慢指標剛好在中間的節點。

判斷鍊錶是否有環:如果鍊錶中存在環,則在鍊錶上不斷前進的指標會一直在環裡繞圈子,且不能知道鍊錶是否有環。使用快慢指標,當鍊表中存在環時,兩個指標最終會在環中相遇。

判斷鍊錶中環的起點:當我們判斷出煉表中存在環,並且知道了兩個指標相遇的節點,我們可以讓其中任乙個指標指向頭節點,然後讓它倆以相同速度前進,再次相遇時所在的節點位置就是環開始的位置。

求鍊錶中環的長度:只要相遇後乙個不動,另乙個前進直到相遇算一下走了多少步就好了

求鍊錶倒數第k個元素:先讓其中乙個指標向前走k步,接著兩個指標以同樣的速度一起向前進,直到前面的指標走到盡頭了,則後面的指標即為倒數第k個元素。(嚴格來說應該叫先後指標而非快慢指標)

一般都是排好序的陣列或鍊錶,否則無序的話這兩個指標的位置也沒有什麼意義。特別注意兩個指標的迴圈條件在迴圈體中的變化,小心右指標跑到左指標左邊去了。常用來解決的問題有

1. 二分查詢問題

2. n數之和問題:比如兩數之和問題,先對陣列排序然後左右指標找到滿足條件的兩個數。如果是三數問題就轉化為乙個數和另外兩個數的兩數問題。以此類推。

兩個指標,一前一後組成滑動視窗,並計算滑動視窗中的元素的問題。

這類問題一般包括

1、字串匹配問題

2、子陣列問題

雙指標演算法

雙指標演算法模板 for int i 0,j 0 i n i 常見問題分類 1 對於乙個序列,用兩個指標維護一段區間 2 對於兩個序列,維護某種次序,比如歸併排序中合併兩個有序序列的操作 例題1 最長連續不重複子序列 給定乙個長度為n的整數序列,請找出最長的不包含重複數字的連續區間,輸出它的長度。輸...

雙指標演算法

title 雙指標演算法 date 2019 05 26 23 45 09 tags 雙指標演算法 雙指標演算法 主要是兩大類 核心思想 將乙個 o n 2 o n 2 o n2 的演算法 優化成 o n o n o n 的for int i 0 i for int j 0 j for i 0,j ...

雙指標演算法

一般雙指標的模板 雙指標演算法的思考方式 先想出暴力做法,再觀察是否存在單調性。傳統的演算法需列舉兩個指標的組合,兩個for迴圈時間複雜度為o n 2 雙指標演算法會使時間複雜度變為o n 給定乙個長度為n的整數序列,請找出最長的不包含重複數字的連續區間,輸出它的長度。輸入格式 第一行包含整數n。第...