首頁 >web前端 >js教程 >DSA 中的兩個指標模式

DSA 中的兩個指標模式

DDD
DDD原創
2025-01-07 18:34:41309瀏覽

嘿那裡!讓我們來討論一下 DSA 中稱為兩指針技術的酷技巧。別擔心,我會保持它的樂趣,並添加一些視覺效果來幫助它堅持下去。準備好潛入了嗎?

那麼,這個兩指針到底是怎麼回事?

將其想像為一個遊戲,其中有兩個玩家(我們稱之為指針)從場地的不同一側(即您的數組)開始。他們可以:

  1. 奔向對方(有點浪漫吧?)
  2. 朝同一個方向比賽(變得有競爭力!)
  3. 做自己的事(自由模式)

這種技術可以幫助您非常有效地解決一堆問題,而無需編寫大量循環。很整潔吧?

為什麼要關心它?

嗯,它就像你的程式碼的超能力:

  • 速度很快:解決問題的時間複雜度為 O(n) 而非 O(n²)。您的程式碼將會縮放!
  • 很簡單:行數更少,更容易理解。
  • 它很靈活:可以處理陣列、字串,甚至連結列表!

讓我們來看看一些類型的兩個指標問題

  1. 互相移動的指針

想像一下,您正在嘗試在已排序的陣列中尋找兩個數字,它們的總和等於目標值。就像兩個人奔向對方,然後在中間相遇。

這是一個快速的 JavaScript 範例:

function twoSumSorted(arr, target) {
    let left = 0;
    let right = arr.length - 1;
    while (left < right) {
        const sum = arr[left] + arr[right];
        if (sum === target) return [left, right];
        if (sum < target) left++;
        else right--;
    }
    return -1; // No pair found
}

console.log(twoSumSorted([1, 2, 3, 4, 6], 10)); // Output: [2, 4]

將數字想像成一行可愛的小字元:
① ② ③ ④ ⑤

Two pointer pattern in DSA

  • 左指標從①開始
  • 右指針從 ⑤ 開始
  • 他們慢慢向對方靠近,尋找完美的搭配

2.這非常適合檢查字串是否是回文。想像兩個朋友從一個單字的末尾開始,如果一切都匹配,則走向中間並擊掌。

function isPalindrome(s) {
    let left = 0;
    let right = s.length - 1;

    while (left < right) {
        if (s[left] !== s[right]) return false;
        left++;
        right--;
    }

    return true;
}

console.log(isPalindrome("racecar")); // Output: true
console.log(isPalindrome("hello"));   // Output: false

想像兩隻螞蟻在「賽車」這個字上互相爬行:
r r ?
一個一個?
c c ?

回文確認! ?

該技術的一些很酷的應用:

  1. 找出目標總和(就像我們上面所做的)
  2. 合併兩個排序數組
  3. 計算截留的雨水(Google這個,太有趣了!)
  4. 反轉鍊錶

專業提示:

  • 先排序可以讓這些問題變得更容易
  • 注意邊緣情況(空數組、重複項、極值)
  • 把它畫出來!繪製數組或字串可以幫助您避免錯誤

想升級嗎?試試這些挑戰:

  1. Two Sum II - 輸入陣列已排序(LeetCode 167)
  2. 無重複字元的最長子字串(LeetCode 3)
  3. 有效回文(LeetCode 125)
  4. 收集雨水(LeetCode 42) - 如果您喜歡冒險!

兩指針技術就像編碼時的瑞士軍刀。它簡單但功能強大,經過一些練習,您將不假思索地使用它。

有疑問或想分享您的解決方案嗎?發表評論或給我留言。快樂編碼!

以上是DSA 中的兩個指標模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn