雙指針
- 雙指針(Two Pointers)
雙指針(Two Pointers)
- 對撞指針(Opposite Direction Two Pointers):
- 對撞指針從兩端向中間移動,一個指針從最左端開始,另一個最右端開始,然后逐漸往中間逼近
- 使用場景:
- 有序數組中尋找兩數之和
- 盛最多水的容器
- 判斷回文字符串/鏈表
- 特點:常用于有序數組,時間復雜度為 O(n) 或 O(n^2)
- 對撞指針的終止條件一般是兩個指針相遇或者錯開(也可能在循環內部找到結果直接跳出循環)
- left == right (兩只指針指向同一位置)
- left > right (兩個指針錯開)
- 快慢指針(Same Direction/SIow-Fast Pointers):又稱龜速賽跑算法,基本思想是使用兩個移動速度不同在數組或鏈表等序列結構上移動.
- 兩個指針從同一個方向出發,一個走快點,一個走慢一點
- 使用場景:
- 刪除倒數第N 個節點
- 檢測鏈表是否有環
- 找鏈表中點
- 會問鏈表判斷
- 特點:適合鏈表或需要跳躍處理的問題
- 對于處理環形鏈表或數組非常有用
- 問題中出現循環往復的情況時,也可以考慮使用快慢指針指針思想
- 滑動窗口(SIiding Window)
- 定義:也可以看做一種雙指針,但強調 “窗口” 的概念。
- 使用場景:
- 最長無重復子串
- 子數組之和等于目標值
- 字符串包含所有字符串的最小子串
- 特點:兩個指針一前一后控制窗口范圍,適用于連續子數組/子串問題
- 歸并排序中的雙指針(Merge Two Sorted Arrays)
- 定義:在歸并排序或合并兩個有序數組時使用雙指針進行合并
- 使用場景:
- 合并兩個有序數組
- 合并兩個有序鏈表
類型 | 移動方向 | 典型應用場景 | 時間復雜度 |
---|---|---|---|
對撞指針 | 對向 | 兩數之和、盛水容器、三數之和 | O(n) ~ O(n2) |
快慢指針 | 同向 | 鏈表找環、刪除倒數節點 | O(n) |
滑動窗口 | 同向擴展窗口 | 最長子串、子數組和 | O(n) |
歸并雙指針 | 同向 | 合并有序數組/鏈表 | O(n + m) |