力扣之迴文數(雙指標中的對撞指標公式模板)

水冗水孚發表於2023-02-02

什麼雙指標

沒刷演算法之前,一聽雙指標,感覺很厲害的樣子。實際上呢?也的確是一個不錯的解題思路方式。

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 ,如果 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 // 如果遍歷完了,依舊一樣,那肯定是迴文數
};

提交圖

由上圖可知,雙指標各方面效能還是不錯的哦。

相關文章