two pointer
Two Pointer 的產生源自於一個核心問題,如何有效處理陣列或者序列中的配對、區間以及範圍搜尋問題。
最初,我們在遇到需要在陣列中尋找配對或者子陣列的問題時,最直觀的方式便是使用雙重迴圈 (nested loops)。例如,在一個陣列中找到兩個數的和等於目標值:
1 | for(int i = 0; i < arr.len(); i++){ |
但是雙重迴圈的方式,導致的後果就是時間複雜度為 $O(n^2)$
相比於暴力解法的「盲目搜尋」,Two Pointer 提供了一種「有方向性的搜尋」策略。
兩者差異在於,暴力解需要檢查所有可能組合,two pointer 需要根據問題特性,有策略性的縮小搜尋範圍。
Key Point
Two Pointer 的產生基於對特定問題特性的觀察:
- 有序性:當陣列已經排序時,我們可以利用這個特性
- 單調性:某些條件具有單調性(例如:左指針右移時,和會增大)
- 互補性:兩個指針的移動可以互相影響,避免重複計算
Two Pointer 有分為兩種:
快慢指標:兩個指標一起指向頭,一個指標按著既有的陣列走,另一個則按照題目需求來移動,讓指標有快慢之分,他們都會朝向同一個方向前進
左右指標:兩個指標分別指向頭尾,在頭的部分會往尾巴移動,在尾的部分則會往頭移動,兩個指標就會逐漸靠近。
本部落格所有文章除特別聲明外,均採用CC BY-NC-SA 4.0 授權協議。轉載請註明來源 YouChen's Blog!