快慢指標技巧彙總

2021-10-21 03:03:11 字數 1933 閱讀 9914

2、返回環的起始位置

3、尋找鍊錶的中點

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

二、左右指標

雙指標技巧可以分為兩類:一類是【快慢指標】、一類是【左右指標】

快慢指標一般初始化指向煉表頭結點head,前進時快指標fast在前,慢指標slow在後,巧妙解決鍊錶中的一些問題。

經典解法就是用兩個指標,乙個每次前進兩步,乙個每次前進一步。如果不含有環,跑得快的那個指標最終會遇到 null,說明鍊錶不含環;如果含有環,快指標最終會超慢指標一圈,和慢指標相遇,說明鍊錶含有環。

141. 環形鍊錶

/**

* definition for singly-linked list.

* struct listnode

* };

*/class solution

return false;}}

;

第一次相遇時,假設慢指標 slow 走了 k 步,那麼快指標 fast 一定走了 2k 步,也就是說比 slow 多走了 k 步(也就是環的長度)。設相遇點距環的起點的距離為 m,那麼環的起點距頭結點 head 的距離為 k - m,也就是說如果從 head 前進 k - m 步就能到達環起點。

巧的是,如果從相遇點繼續前進 k - m 步,也恰好到達環起點。

class solution }if

(hascycle)

return slow;

}else

return

null;}

};

快指標一次前進兩步,慢指標一次前進一步,當快指標到達鍊錶盡頭時,慢指標就處於鍊錶的中間位置。

876. 鍊錶的中間結點

class solution 

return slow;}}

;

我們的思路還是使用快慢指標,讓快指標先走 k 步,然後快慢指標開始同速前進。這樣當快指標走到鍊錶末尾 null 時,慢指標所在的位置就是倒數第 k 個鍊錶節點.

劍指 offer 22. 鍊錶中倒數第k個節點

/**

* definition for singly-linked list.

* struct listnode

* };

*/class solution

while

(fast !=

null

)return slow;}}

;

左右指標在陣列中實際是指兩個索引值,一般初始化為 left = 0, right = nums.length - 1 。

int

binaryserarch

(vector<

int>

&nums,

int target)

else

if(nums[mid]

< target)

else

}return-1

;}

如果陣列有序,就應該想到雙指標技巧。這道題的解法有點類似二分查詢,通過調節 left 和 right 可以調整 sum 的大小:

int

twosum

(vector<

int>

&nums,

int target);}

else

if(num < target)

else

}return

;}

void

reverse

(int

nums)

}

也許是雙指標技巧的最高境界了,如果掌握了此演算法,可以解決一大類子字串匹配的問題,不過「滑動視窗」演算法比上述的這些演算法稍微複雜些,將再詳細記錄。

雙指標技巧彙總

源自 labuladong 鍊錶指標陣列題,用雙指標別猶豫 快慢指標最神奇,鍊錶操作無壓力 歸併排序找中點,鍊錶成環搞判定 左右指標很常見,左右兩端向前行 反轉陣列要靠他,二分查詢是弟弟 2.已知鍊錶中含有環,返回這個環的起始位置 3.尋找鍊錶的中點 4.尋找鍊錶的倒數第 k 個元素 二 左右指標 ...

快慢指標 雙指標

雙指標 二 左右指標的常用演算法 鏈結 利用快慢指標 最開始slow與fast指標都指向鍊錶第乙個節點,前者解決主要解決鍊錶中的問題,listnode detectcycle listnode head slow head while slow fast return slow 設相遇點距環的起點的...

快慢指標問題

快慢指標可以用來檢測鍊錶是否有環,問題是為什麼快指標一定會追上慢指標呢?從數學的角度,當快指標步長為2時,慢指標走完一圈,此時快指標走完2圈,必定在第乙個節點相遇 以此類推,當快指標步長為n時,慢指標走完一圈,此時快指標走完n圈,必定會在第乙個節點相遇,但是初次遇見未必是在第乙個節點 有意思的是從物...