雙指標可分為三類:
其中,滑動視窗 已單獨寫了一篇隨筆,可跳轉檢視。
在快慢指標中,又有一類典型演算法,叫 floyd's cycle-finding algorithm,其又名floyd's hare and tortoise algorithm
。
在這裡,我們主要談論左右指標和快慢指標。左右指標 主要應用在陣列中,快慢指標 主要應用在陣列和鍊錶中。
見名知意,左右指標就是指標在陣列的兩端向中間靠攏,典型的二分法使用的就是此類指標。
const binarysearch = (nums, target) =>
return -1;
}
let reverse = (nums) =>
}
快慢指標中的一類典型演算法已經寫了隨筆,可跳轉看看。floyd's cycle-finding algorithm
快慢指標,其實就是有 fast、slow 指標,它們以不同的速度前進,或者fast
先行,滿足一定條件後,slow
再前行。
讓fast
指標一次兩步,slow
指標一次一步,當fast
指標到達鍊錶尾時,slow
指標就處於鍊錶的中間位置,或者是中間偏右的位置(偶數個結點)。
如果是找中間數或者刪除中間結點時,我們可以加多乙個變數來記錄slow
的上一步的結點,以便操作。
while (fast !== null && fast.next !== null)
這裡是讓fast
指標先行 k 步,然後兩指標同時同步前進。當fast
指標到達指標末尾時,slow
指標就是倒數第k個元素了。
while (k-- > 0)
while (fast !== null)
// 此時 slow 就是倒數第k個元素
我們讓fast
先行,如果找到不是指定移除的元素的元素,我們就讓它替換到slow
的位置,然後slow
指標前進一步。
當操作完成後,slow
指標的位置就是操作後的陣列的長度。下面演算法主要展示的是移除陣列元素的,移除鍊錶元素也是同樣的操作,不過最後的slow
指標指向的結點的next域需要置空。
用快慢指標就可以在原陣列或鍊錶的基礎上進行移除元素,當然這要看實際需求,如果不能操作原資料,則需要消耗o(n)空間複雜度。
let slow = 0, fast = 0;
while (fast < nums.length)
fast++;
}
左右指標,快慢指標就是這麼簡單的操作,複雜的還是滑動視窗,不過其也是有套路可循的。
演算法,最重要的還是其背後的思維。把演算法思維轉化為**也是很重要的。
還需很努力,很有很多演算法沒有掌握,輸入消化吸收後也要對應輸出。
演算法之雙指標法(一)
雙指標法在很多場景及演算法中都有使用 主要應用的演算法題如下 乙個陣列中有奇數也有偶數,將所有奇數放到陣列左邊,將所有偶數放到陣列右邊 int array int i 0 int j array.lentgh 1 while i j while iarray j 0x1 0 if i j 時間複雜度...
演算法之雙指標法 一
雙指標法在很多場景及演算法中都有使用 主要應用的演算法題如下 乙個陣列中有奇數也有偶數,將所有奇數放到陣列左邊,將所有偶數放到陣列右邊 int array int i 0 int j array.lentgh 1 while i j int even 0 偶數 int odd 1 奇數 int en...
雙指標法LeetCode總結
遍歷物件的過程中,使用兩個指標進行操作,實現相應的目的 經典環形鍊錶 leetcode142 待補充適用於有序陣列,設定陣列左索引與陣列右索引 基本流程是 publicf int nums leetcode11 盛水最多的容器 class solution return max leetcode15...