Leetcode解題思想總結篇:雙指針

Leetcode解題思想總結篇:雙指針

1概念

雙指針:快慢指針。
快指針在每一步走的步長要比慢指針一步走的步長要多。快指針一般的步速是慢指針的2倍。html

在循環中的指針移動一般爲:
faster = faster.next.next; slower = slower.next;node

2 應用

2.1. 用來判斷鏈表是否有環以及尋找環入口

  • Linked List Cycle
  • Linked List Cycle II

是否有環:快慢指針思想,注意循環條件:(fast != null) && (fast.next != null)spring

尋找環的入口:快慢指針相遇的時候,distance(fast指針) = 2 * distance(slow指針),能夠推導出,只要把fast從新指向頭結點,兩個指針以同樣的速度走,相遇的時候,即是環的入口。數組

2.2.數組尋找範圍

  • Summary Ranges

範圍的尋找,用2個指針:startend來記錄範圍。注意循環條件和判斷條件:(end + 1 < len) && (nums[end + 1] == nums[end] + 1)函數

2.3.鏈表或者數組中移除重複的元素

  • Remove Duplicates from Sorted List I
  • Remove Duplicates from Sorted List II

Sorted List I用兩個指針一前一後指向鏈表。維護兩個指針:指針

  • tail 一個指向當前不重複的最後一個元素,
  • pCur 一個進行依次掃描,遇到不重複的則更新第一個指針,繼續掃描,不然就把前面指針指向當前元素的下一個(即把當前元素從鏈表中刪除)。

Sorted List II 維護兩個指針:code

  • prev前驅指針指向上一個不重複的元素
  • pCur遍歷指針
    思路相似Sorted List I,細節更多。
    尋找不重複的元素 while循環條件pCur.next != null && prev.next.val == pCur.next.val

Array數組中的解題思想同樣:htm

  • index指向上當前不重複的最後一個元素
  • i遍歷數組

2.4. 用來找中點或中位數

2.5. 倒數第n個

題目中含有:倒數第n個,那麼設置快指針步長爲n,而後快慢指針同時以同一速度走,用慢指針尋找倒數第n個blog

2.6. 拆分鏈表

Partition List

給定一個x的值,小於x都放在大於等於x的前面,而且不改變鏈表之間node原始的相對位置。example中 4->3->5都是大於等3的數,這保持了他們原來的相對位置。leetcode

使用鏈表最經常使用的雙指針:

  • 一個指向當前小於x的最後一個元素
  • 一個進行往前掃描。若是元素大於x,那麼繼續前進,不然,要把元素移到前面,並更新第一個指針。

Reorder List

思路:
1.利用快慢兩個指針將鏈表一分爲二;
2.針對第二個子鏈表求倒序;
3.利用merge思想將兩個子鏈表合併。

3 相關題目

4 注意

  1. 一般須要特別留意鏈表長度的奇偶性
  2. 若是快指針步速爲慢指針步速2倍,循環條件爲:faster.next!=null && faster.next.next!=null
  3. 當自行設置快指針步長時, 要考慮步長值等於鏈表長度的特殊狀況
  4. 查找倒數第n個時,若是要求刪除鏈表元素時,不要忘記記錄應被刪除元素的前一個元素
  5. 對於鏈表的題目,經常都會用到Two Pointers的思想。鏈表注意構建dummy頭結點。在Java中,因爲沒有free函數,因此在刪除一個節點的時候,沒法用node = null來刪除一個節點,須要用前一個節點來指向刪除節點的下一個prev.next = node.next這樣來刪除node節點。

5 參考

相關文章
相關標籤/搜索