Multiple points 題型簡單介紹
Multiple points 的操作,經常用在 array 或 linkedList 上,有幾點事情可以在刷題時特別注意:
指標會把 list 切成幾個部分,特別注意每一部份的定義
list 是否有排序或可以排序
指標移動是使用快慢指標還是左右指標
會不會改變原本的 list
其中第一點,把 array 切成幾個部分,每個部份的定義,是最重要的思想,可以多思考。
區間定義
針對 Two points 的操作,會把目標切成幾個部分,可以由下圖知道,這裡舉例 i, j
:
- 同向
[0,i)
: 處理好[i,j)
: 不需要[j,length)
: 還沒處理過的
- 反向
[0,i)
: 處理好[i,j]
: 還沒處理過的(j,length)
: 處理好
區間的開閉,會需要依照題目要求定義,但注意 ! 每個區間連接處(如 i 點位置),不能有兩種意思 !
快慢指標
多用於 Linked-List 的問題 :
- 找到 Linked-List 中心點;慢指標一次走一步,快指標一次走兩步,當 fast pointer 抵達尾端的時候, slow pointer 就會是在中間的位置。
- 找到 Linked-List 倒數第 K 個節點;先讓 fast pointer 先走 K 步,然後 Slow and Fast 兩個指標再使用一樣的速率前進,當 fast pointer 抵達尾端的時候, slow pointer 就會是在倒數第 K 個節點的位置
- 可以判斷 linked list 是否有環,若是兩個指標相遇,代表有環
該如何理解兩指標相遇就代表環存在?
想成在操場上跑步,跑的快的人最終都會超過跑的慢的人,兩個指標如果都進入到環中,最終跑的快的人會追上跑的慢的人。
左右指標
主要處理對稱相關的題目,例如 :
- 反轉 array
- 檢查 palindrome 回文