什麼雙指標
沒刷演算法之前,一聽雙指標,感覺很厲害的樣子。實際上呢?也的確是一個不錯的解題思路方式。
在LeetCode
上的雙指標
是一大類題目的解決方式,看一下,發現有近200題是雙指標
型別的,如下圖:
由此可見,雙指標的重要性。
那,什麼是雙指標
?在說雙指標
之前,我們先看一下**單指標**
。比如我們平常遍歷一個陣列,都是定義一個變數let i
,透過這個變數i
可以訪問到每一項的值,這是常用的方式,可以姑且稱之為**單指標**
吧,如下程式碼:
for (let i = 0; i < arr.length; i++) {
// ......
}
對應的,通俗易懂地說,雙指標是:在遍歷迴圈的時候,定義兩個變數作為索引,去做一些查詢判斷程式碼操作。
按照雙指標的指標運動方向,又分為對撞指標
、快慢指標
、以及綜合類的多指標
。
對撞指標
- 對撞指標就是定義兩個變數索引,一左一右,由於然後左側的往右走、右側的往左走,直至匯合相遇相撞停下
- 對撞一般搭配
while
迴圈多一些 - 對撞指標是有對應的模板套路公式的,如下:
var doublePointerFn = function(params){
let left = 0 // 左側指標,從第一項開始
let right = params.length - 1 // 左側指標從最後一項開始
// 當左側指標的位置小於右側指標時,一直執行,直到左側指標大於右側指標才停下
while(left <= right){
// 程式碼操作
left = left + 1 // 左側指標往右走
right = right - 1 // 右側指標往左走
}
// [程式碼操作]
}
筆者之前刷題中,有使用雙指標方式(對撞指標)進行解題的,如下連結:
- 力扣之x的平方根(雙指標解法思路分析最佳化)https://segmentfault.com/a/11...
- 力扣之反轉字串之原地修改輸入陣列(雙指標方式)https://segmentfault.com/a/11...
- 道友有空可以看看,我們繼續往下閱讀
快慢指標
- 快慢指標也是兩個指標
- 都是從一側出發
- 可能一個指標跑得快,另一個指標跑得慢,直至相遇操作
關於快慢指標的應用題目主要是連結串列的一些操作,筆者還沒刷到連結串列
題目,這裡先不總結了,後續補上
多指標
多指標一般用在稍微複雜一些的題目上,對 對撞指標和快慢指標
進行綜合的考量。
今天我們繼續來使用對撞指標
來做一道簡單的題目:力扣之迴文數
題目描述
給你一個整數 x
,如果 x
是一個迴文整數,返回 true
;否則,返回 false
。
迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。
- 例如,
121
是迴文,而123
不是。
示例 1:
輸入: x = 121
輸出: true
示例 2:
輸入: x = -121
輸出: false
解釋: 從左向右讀, 為 -121 。 從右向左讀, 為 121- 。因此它不是一個迴文數。
示例 3:
輸入: x = 10
輸出: false
解釋: 從右向左讀, 為 01 。因此它不是一個迴文數。
力扣原題目地址:https://leetcode.cn/problems/...
思路分析
- 將數字轉為字串
- 然後定義兩個變數索引(左右對撞雙指標)
- 左側往右、右側往左遍歷(直至相遇)
- 當出現一個不相等的時候,就說明不是迴文數
- 相等就繼續遍歷
程式碼
var isPalindrome = function (x) {
x = x + '' // 數字轉字串
let left = 0 // 左側指標從第一項開始
let right = x.length - 1 // 右側指標從最後一項開始
while (left <= right) { // 正常左側小於右側,繼續遍歷
if (x[left] == x[right]) { // 迴文即為對應位置的值一樣
left = left + 1 // 一樣的話,兩個指標就繼續雙向奔赴
right = right - 1 // 直至相遇
} else {
return false // 不一樣的話,就不用往後看了,就說明不是迴文數呢
}
}
return true // 如果遍歷完了,依舊一樣,那肯定是迴文數
};
提交圖
由上圖可知,雙指標各方面效能還是不錯的哦。