」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 二指針演算法解釋

二指針演算法解釋

發佈於2024-11-08
瀏覽:524

Two pointers algorithm explained

我想解釋一個簡單有效的技巧,你可以在面試中處理數組、字串、鍊錶等時使用它。這也將提高你對這些數據的基礎知識結構。

讓我們從理論開始。該演算法有兩個常見用例:

  • left/right 這個演算法的中心概念是有兩個整數變量,它們將從字串或數組的兩側移動。通常,人們稱之為左和右。左邊將從0索引移動到長度-1,右邊則相反。

  • 慢/快 指標以相同方向運行,例如,從開始到結束,但一個指標比另一個指標運行得更快。在這種情況下,人們通常稱變數為慢速和快速。

演算法是基本的,理解它們的最佳方法是研究一些例子。

首先我們來看一個左右指針的情況。這是我們可以使用該演算法解決的問題的基本範例。目標很明確:我們想要找到一對總和等於給定數字的對。
暴力方法會產生嵌套循環,但使用它通過面試的機會很低。
更好的方法是使用兩個指標演算法並在一個循環中找到它以具有 O(n) 複雜度而不是 O(n²)


const findPair = (arr, target) => {
    let left = 0;                 // Start with two pointers left from start, right, from the end
    let right = arr.length - 1;

    while (left 

讓我們切換到指針有不同速度的方法。這是一個常見的問題,你可以在面試中遇到。您需要找到給定連結清單的中間位置。
蠻力方法不像前面的例子那麼糟糕,但面試官期望有更好的方法。
使用兩個指標演算法,您將以 O(n) 複雜度解決此問題,而如果您使用兩個順序循環,暴力方法將需要 O(2n)。


class ListNode {
    constructor(value) {
        this.value = value;
        this.next = null;
    }
}

const findMiddle = (head) => {
    if (!head) return null;

    let slow = head;
    let fast = head;

    while (fast && fast.next) {
        slow = slow.next;           // Move slow pointer one step
        fast = fast.next.next;      // Move fast pointer two steps
    }

    return slow;  // Slow pointer will be at the middle
}

// Creating a linked list 1 -> 2 -> 3 -> 4 -> 5
const head = new ListNode(1);
const node2 = new ListNode(2);
const node3 = new ListNode(3);
const node4 = new ListNode(4);
const node5 = new ListNode(5);

head.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;

findMiddle(head).value);  // Output: 3 (middle node)


版本聲明 本文轉載於:https://dev.to/okaz/two-pointers-algorithm-explained-3k0e?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • C++跨平台如何取得當前時間和日期?
    C++跨平台如何取得當前時間和日期?
    在C 跨平台中獲取當前時間和日期C 標準庫現在提供了一種方便且可移植的方式來檢索當前時間並透過std::chrono::system_clock 類別取得日期。在 C 11 中引入,此類提供了一個獨立於系統的接口,用於存取高分辨率計時資訊。 文法:auto now = std::chrono::sy...
    程式設計 發佈於2024-12-23
  • JavaScript 物件解構如何簡化函數參數?
    JavaScript 物件解構如何簡化函數參數?
    解開函數參數中JavaScript 物件解構的語法如果你想用這樣的物件參數定義函數:function moo({ a, b, c }) { // valid syntax! print(a); // prints 4 }...你沒有出現幻覺。這種語法稱為解構,可讓您將物件屬性直接解壓縮到函數...
    程式設計 發佈於2024-12-23
  • 儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    解決PHP 中的POST 請求故障在提供的程式碼片段中:action=''而非:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"檢查$_POST陣列:表單提交後使用 var_dump 檢查 $_POST 陣列的內...
    程式設計 發佈於2024-12-23
  • Node.js如何有效防範SQL注入攻擊?
    Node.js如何有效防範SQL注入攻擊?
    防範 Node.js 中的 SQL 注入攻擊在 Web 開發中,防範 SQL 注入攻擊至關重要。 Node.js 開發人員傳統上在這方面面臨困境,因為廣泛使用的 node-mysql 模組缺乏與 PHP 的預處理語句相媲美的內建保護。 Node-JS 可以防止 SQL 注入攻擊嗎? 幸運的是,nod...
    程式設計 發佈於2024-12-23
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-12-23
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-12-23
  • PHP 中如何檢查複選框是否被選取?
    PHP 中如何檢查複選框是否被選取?
    在 PHP 中讀取複選框狀態使用 HTML 表單時,通常需要知道複選框是否已選取。在 PHP 中,有多種方法可以實現此功能。 使用isset()如果您的HTML 程式碼包含具有以下結構的複選框:<input type="checkbox" name="test&q...
    程式設計 發佈於2024-12-23
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2024-12-23
  • 插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入記錄時如何解決「一般錯誤:2006 MySQL 伺服器已消失」介紹:將資料插入MySQL 資料庫有時會導致錯誤「一般錯誤:2006 MySQL 伺服器已消失」。當與伺服器的連線遺失時會出現此錯誤,通常是由於 MySQL 配置中的兩個變數之一所致。 解決方案:解決此錯誤的關鍵是調整wait_tim...
    程式設計 發佈於2024-12-23
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1 和 $array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建...
    程式設計 發佈於2024-12-23
  • HTML 格式標籤
    HTML 格式標籤
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    程式設計 發佈於2024-12-23
  • 為什麼我的 Angular HTTP POST 值在 PHP 中未定義,如何修復它?
    為什麼我的 Angular HTTP POST 值在 PHP 中未定義,如何修復它?
    Angular HTTP POST 到PHP:處理未定義的POST 值在AngularJS 中,對PHP 端點執行HTTP POST 請求有時會導致未定義的值伺服器端的POST 值。當預期資料格式與 Angular 應用程式傳送的實際資料不符時,就會發生這種情況。 要解決此問題,確保正確設定 Con...
    程式設計 發佈於2024-12-23
  • Go可以存取初始標準輸入流嗎?
    Go可以存取初始標準輸入流嗎?
    在 Go 中,您可以存取初始標準輸入嗎? 在 Go 中,使用 os.Stdin 從原始標準輸入讀取應該會產生所需的結果,如圖所示通過這個代碼片段:package main import "os" import "log" import "io&quo...
    程式設計 發佈於2024-12-23
  • 極簡密碼管理器桌面應用程式:進軍 Golang 的 Wails 框架(第 2 部分)
    極簡密碼管理器桌面應用程式:進軍 Golang 的 Wails 框架(第 2 部分)
    Hi again, coders! In the first part of this short series we saw the creation and operation of a desktop application to store and encrypt our passwords...
    程式設計 發佈於2024-12-23
  • ES6 React 元件:何時使用基於類別與函數式?
    ES6 React 元件:何時使用基於類別與函數式?
    在ES6 基於類別和函數式ES6 React 元件之間做出選擇使用React 時,開發人員面臨著使用ES6 基於類別的選擇組件或功能ES6 組件。了解每種類型的適當用例對於最佳應用程式開發至關重要。 函數式 ES6 元件:無狀態且簡單函數式元件是無狀態的,這表示它們不維護任何內部狀態。他們只是接收道...
    程式設計 發佈於2024-12-23

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3