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

二指針演算法解釋

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

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]刪除
最新教學 更多>
  • 可以處理變數的 ID 以存取 Python 中的物件嗎?
    可以處理變數的 ID 以存取 Python 中的物件嗎?
    變數的 ID 可以取消引用嗎? 在 Python 中,id() 函數傳回物件的唯一識別碼。這個標識符可以儲存在變數中,但是這個變數的ID可以解引用嗎? 從學術角度來看,答案是肯定的。 _ctypes 模組提供了一個函數 PyObj_FromPtr(),可以將指標轉換為 Python 物件。使用此函數...
    程式設計 發佈於2024-11-08
  • 為什麼 imagecreatefrompng() 產生黑色背景而不是透明區域?
    為什麼 imagecreatefrompng() 產生黑色背景而不是透明區域?
    imagecreatefrompng() 產生黑色背景而不是透明區域? 在 PHP 中,imagecreatefrompng() 函數通常用於處理 PNG映像。然而,據觀察,使用此函數時,PNG 透明度可能會轉換為純黑色。 要解決此問題,可以在使用imagecreatetruecolor() 建立新...
    程式設計 發佈於2024-11-08
  • Go反射中reflect.Type和reflect.Value的主要差異是什麼?
    Go反射中reflect.Type和reflect.Value的主要差異是什麼?
    Go 中的反射類型和值Go 中的反射允許開發人員在運行時檢查和操作類型和值。了解它們的差異對於有效使用反射至關重要。 反射中的類型與值在反射中,reflect.TypeOf(i) 返回一個reflect.Type 對象,而reflect.ValueOf(i)返回一個reflect.Value obj...
    程式設計 發佈於2024-11-08
  • 如何在 AngularJS 中安全地設定變數的 iframe src 屬性?
    如何在 AngularJS 中安全地設定變數的 iframe src 屬性?
    在AngularJS 中從變數設定iframe src 屬性在AngularJS 中,嘗試從下列位置設定iframe 的src 屬性時可能會遭遇到問題一個變數。為了解決這個問題,這裡有一個逐步指南:1。注入 $sce 服務將 $sce(嚴格上下文轉義)服務注入控制器以處理清理。 function A...
    程式設計 發佈於2024-11-08
  • 為什麼我的 KeyListener 無法在 JPanel 中運作?
    為什麼我的 KeyListener 無法在 JPanel 中運作?
    JPanel 中KeyListeners 無回應:常見問題當使用KeyListeners 偵測JPanel 中的按鍵時,開發人員經常遇到這樣的問題:偵聽器無法觸發所需的操作。此問題可能由多個因素引起。 焦點元件約束KeyListener 依賴將自身附加到焦點元件才能正常運作。預設情況下,焦點不會自動...
    程式設計 發佈於2024-11-08
  • 從 React 到 React Native 的旅程
    從 React 到 React Native 的旅程
    作为一名 React / JS 开发人员,您可能有这样的想法 “我应该学习 React Native 吗?” 这是一个公平的问题,也是我几年前问自己的问题。事实证明,学习 React Native 绝对是正确的决定。这让我成为了亚马逊的高级开发倡导者,我现在使用 React Native 跨 And...
    程式設計 發佈於2024-11-08
  • 使用 Filament 和 Laravel 建立強大的管理面板:逐步指南
    使用 Filament 和 Laravel 建立強大的管理面板:逐步指南
    Laravel 是一个强大的 PHP 框架,为开发 Web 应用程序提供了坚实的基础。 Filament 是一个开源、优雅的 Laravel 管理面板和表单构建器,可简化管理界面的创建。本指南将引导您使用最新版本的 Filament 和 Laravel 构建强大的管理面板。 Laravel SaaS...
    程式設計 發佈於2024-11-08
  • 如何從 Pandas DataFrame 提取列標題?
    如何從 Pandas DataFrame 提取列標題?
    從 Pandas DataFrame 擷取列標題從 Pandas DataFrame 擷取列標題Pandas DataFrame 是通用的資料結構,可實現高效率的資料操作與分析。一項常見任務涉及提取列標題,這對於獲取 DataFrame 結構的概述或進一步處理非常有用。 假設您有一個從使用者輸入匯入...
    程式設計 發佈於2024-11-08
  • 透過範例解釋 Web 儲存 API
    透過範例解釋 Web 儲存 API
    Web Storage API: বিস্তারিত আলোচনা Web Storage API হলো জাভাস্ক্রিপ্টের একটি শক্তিশালী API যা ব্রাউজারে ব্যবহারকারীর ডেটা স্টোর করার জন্য ব্যবহ...
    程式設計 發佈於2024-11-08
  • 使用 Web 工具進行 Android 開發:使用 Ionic React 進行生產的最快方式
    使用 Web 工具進行 Android 開發:使用 Ionic React 進行生產的最快方式
    Investing in Android development can yield a huge device market share, expanded market reach, and high return on investment. With over 6.8 billion sma...
    程式設計 發佈於2024-11-08
  • 在Python中如何檢查字串是否以“hello”開頭?
    在Python中如何檢查字串是否以“hello”開頭?
    在Python中驗證以「hello」開頭的字串在Python中,判斷字串是否以「hello」開頭類似於Bash的常規表達方式。實作方法如下:aString = "hello world" aString.startswith("hello")startswit...
    程式設計 發佈於2024-11-08
  • 使用 Flama JWT 身份驗證保護 ML API
    使用 Flama JWT 身份驗證保護 ML API
    You've probably heard about the recent release of Flama 1.7 already, which brought some exciting new features to help you with the development and pro...
    程式設計 發佈於2024-11-08
  • 掌握 MySQL 效能:MySQL 延遲是什麼及其重要性
    掌握 MySQL 效能:MySQL 延遲是什麼及其重要性
    了解数据库性能的复杂性可能具有挑战性,但了解延迟等关键指标至关重要。随着企业越来越依赖数据驱动的洞察力,确保数据库快速有效地响应变得至关重要。在本文中,我们将深入探讨 MySQL 延迟的概念、其重要性,以及数据库优化先驱 Releem 如何处理此指标。 什么是延迟? 延迟是一个在从网...
    程式設計 發佈於2024-11-08
  • 如何以程式設計方式檢查預設瀏覽器是否在 Android 上運行?
    如何以程式設計方式檢查預設瀏覽器是否在 Android 上運行?
    檢查Android上的應用程式執行狀態作為Android開發者,您可能經常會遇到需要檢查特定應用程式是否運行的情況,例如預設瀏覽器正在運行。此功能對於在應用程式中實現條件行為或互動至關重要。 要以程式設計方式完成此操作,一種簡單的方法涉及利用 ActivityManager 類別。以下程式碼片段提供...
    程式設計 發佈於2024-11-08
  • Nestjs 中的事件
    Nestjs 中的事件
    什麼是活動? 事件是指示已發生操作或狀態變更的訊號或通知。在應用程式的上下文中,事件允許系統的不同部分以非同步和解耦的方式進行通訊。這在微服務架構中特別有用,在微服務架構中,您需要元件獨立運行,但仍然能夠「監聽」並對系統其他地方發生的變化做出反應。 NestJS 中的事件 在 NestJS 中,...
    程式設計 發佈於2024-11-08

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

Copyright© 2022 湘ICP备2022001581号-3