雙指標技巧彙總

2021-10-25 02:12:10 字數 1712 閱讀 9526

源自 labuladong

鍊錶指標陣列題,用雙指標別猶豫

快慢指標最神奇,鍊錶操作無壓力

歸併排序找中點,鍊錶成環搞判定

左右指標很常見,左右兩端向前行

反轉陣列要靠他,二分查詢是弟弟

2.已知鍊錶中含有環,返回這個環的起始位置

3.尋找鍊錶的中點

4.尋找鍊錶的倒數第 k 個元素

二、左右指標

快指標走兩步,慢指標走一步:

快指標走到null,無環

兩個指標相遇,有環

為什麼有環二者一定會相遇?

這裡給出我的理解。以下圖這個有環的鍊錶為例,

從「快指標和慢指標同時從鍊錶的頭結點出發」到「快指標最終和慢指標相遇」,這中間的過程可以分為兩個階段:「無聊的第1階段:快指標、慢指標一起往前跑」和「精彩的第2階段——快指標追慢指標」。

在「無聊的第1階段:快指標、慢指標一起往前跑」中,快指標和慢指標一起往前跑,每一次快指標往前跑兩步、慢指標往前跑一步,直到快指標出現在慢指標的後面,具體請看下圖。

無聊的第一階段

在「精彩的第2階段——快指標追慢指標」中,

對於鍊錶有環的情況,為什麼快慢指標一定會相遇?快慢指標一定會相遇的精髓在於:當「快指標出現在慢指標後面」之後,每一次「快指標往前走兩步、慢指標往前走一步」,相當於快指標和慢指標之間的相對距離減少1步。

假如說,當快指標剛剛繞到慢指標後面時,快指標離慢指標有n步。那麼,對於接下來的每一次「快指標往前走兩步、慢指標往前走一步」,快指標和慢指標之間的距離由n步變成n-1步、由n-1步變成n-2步、……、由3步變成2步、由2步變成1步、由1步變成0步。

所以對於有環的情況,快慢指標一定會相遇。

以上**原博

fast指標一次走兩步

slow指標一次走一步

當兩個指標相遇後,將slow指標指向煉表頭節點,再次相遇的位置就是環的起始位置。

fast走兩步,slow走一步

fast走到最後乙個節點的時候,slow走到鍊錶中間節點

如果鍊錶有奇數個節點,slow正好走到最中間,如果是偶數個節點,slow走到中間偏右那個節點

讓快指標先走 k 步,然後快慢指標開始同速前進。這樣當快指標走到鍊錶末尾 null 時,慢指標所在的位置就是倒數第 k 個鍊錶節點(為了簡化,假設 k 不會超過鍊錶長度):

只要陣列有序,就應該想到雙指標技巧。這道題的解法有點類似二分查詢,從前往後可以讓sum變大,從後往前可以讓sum縮小,通過調節 left 和 right 可以調整 sum 的大小:

}滑動視窗問題一般解決子串包含之類的問題

雙指標技巧

我們通過迭代陣列來解決一些問題。通常,我們只使用從第乙個元素開始並在最後乙個元素結束的乙個指標來進行迭代。但是,有時候,我們可能需要同時使用兩個指標來進行迭代。例如 翻轉陣列中的元素 void reverse vector nums 總之,使用雙指標技巧的典型場景之一是你想要從兩端向中間迭代陣列。這...

雙指標技巧總結

我把雙指標技巧再分為兩類,一類是 快慢指標 一類是 左右指標 前者解決主要解決鍊錶中的問題,比如典型的判定鍊錶中是否包含環 後者主要解決陣列 或者字串 中的問題,比如二分查詢。一 快慢指標的常見演算法 快慢指標一般都初始化指向鍊錶的頭結點 head,前進時快指標 fast 在前,慢指標 slow 在...

雙指標技巧總結

141.環形鍊錶 141.環形鍊錶ii 167.兩數之和 ii 輸入有序陣列 我把雙指標技巧再分為兩類,一類是 快慢指標 一類是 左右指標 前者解決主要解決鍊錶中的問題,比如典型的判定鍊錶中是否包含環 後者主要解決陣列 或者字串 中的問題,比如二分查詢。快慢指標一般都初始化指向鍊錶的頭結點 head...