我把雙指標技巧再分為兩類,一類是「快慢指標」,一類是「左右指標」。前者解決主要解決鍊錶中的問題,比如典型的判定鍊錶中是否包含環;後者主要解決陣列(或者字串)中的問題,比如二分查詢。
一、快慢指標的常見演算法
快慢指標一般都初始化指向鍊錶的頭結點 head,前進時快指標 fast 在前,慢指標 slow 在後,巧妙解決一些鍊錶中的問題。
1、判定鍊錶中是否含有環
這應該屬於鍊錶最基本的操作了,如果讀者已經知道這個技巧,可以跳過。
單鏈表的特點是每個節點只知道下乙個節點,所以乙個指標的話無法判斷鍊錶中是否含有環的。
如果鍊錶中不含環,那麼這個指標最終會遇到空指標 null 表示鍊錶到頭了,這還好說,可以判斷該鍊錶不含環。
boolean hascycle(listnode head) ;
} else if (sum < target) else if (sum > target) ;
3、反轉陣列
void reverse(int nums) {
int left = 0;
int right = nums.length - 1;
while (left < right) {
// swap(nums[left], nums[right])
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
left++; right--;
4、滑動視窗演算法
這也許是雙指標技巧的最高境界了,如果掌握了此演算法,可以解決一大類子字串匹配的問題,不過「滑動視窗」稍微比上述的這些演算法複雜些。
幸運的是,這類演算法是有框架模板的,而且這篇文章就講解了「滑動視窗」演算法模板,幫大家秒殺幾道 leetcode 子串匹配的問題。
雙指標技巧總結
141.環形鍊錶 141.環形鍊錶ii 167.兩數之和 ii 輸入有序陣列 我把雙指標技巧再分為兩類,一類是 快慢指標 一類是 左右指標 前者解決主要解決鍊錶中的問題,比如典型的判定鍊錶中是否包含環 後者主要解決陣列 或者字串 中的問題,比如二分查詢。快慢指標一般都初始化指向鍊錶的頭結點 head...
雙指標技巧
我們通過迭代陣列來解決一些問題。通常,我們只使用從第乙個元素開始並在最後乙個元素結束的乙個指標來進行迭代。但是,有時候,我們可能需要同時使用兩個指標來進行迭代。例如 翻轉陣列中的元素 void reverse vector nums 總之,使用雙指標技巧的典型場景之一是你想要從兩端向中間迭代陣列。這...
雙指標技巧彙總
源自 labuladong 鍊錶指標陣列題,用雙指標別猶豫 快慢指標最神奇,鍊錶操作無壓力 歸併排序找中點,鍊錶成環搞判定 左右指標很常見,左右兩端向前行 反轉陣列要靠他,二分查詢是弟弟 2.已知鍊錶中含有環,返回這個環的起始位置 3.尋找鍊錶的中點 4.尋找鍊錶的倒數第 k 個元素 二 左右指標 ...