演算法思維 雙指標法

2022-07-20 04:15:08 字數 1657 閱讀 4630

雙指標可分為三類:

其中,滑動視窗 已單獨寫了一篇隨筆,可跳轉檢視。

在快慢指標中,又有一類典型演算法,叫 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...