1、雙指針法

一、了解雙指針

雙指針(Two Pointers)是一種常用的算法技巧,通常用于解決數組或鏈表中的問題。它的核心思想是使用兩個指針(或索引)在數據結構中遍歷或搜索,從而高效地解決問題。雙指針技巧通常可以將時間復雜度從 (O(n^2)) 優化到 (O(n))。

推薦先看這個視頻,再看下面文章


二、 雙指針的常見應用場景

  1. 有序數組的兩數之和

    • 給定一個有序數組和一個目標值,找到兩個數使它們的和等于目標值。
    • 使用雙指針,一個指向數組開頭,一個指向數組末尾,根據和的大小移動指針。
  2. 移除數組中的重復元素

    • 給定一個有序數組,原地移除重復元素。
    • 使用雙指針,一個指針用于遍歷數組,另一個指針用于記錄非重復元素的位置。
  3. 滑動窗口問題

    • 給定一個數組和一個窗口大小,找到滿足條件的子數組。
    • 使用雙指針表示窗口的左右邊界,根據條件滑動窗口。
  4. 鏈表的快慢指針

    • 判斷鏈表是否有環,或找到鏈表的中間節點。
    • 使用快慢指針,快指針每次移動兩步,慢指針每次移動一步。

二、 雙指針的技巧總結

1. 對撞指針

對撞指針 是一種常用的雙指針技巧,通常用于解決數組或字符串中的問題。它的核心思想是使用兩個指針,一個從數組的起始位置(左指針)開始,另一個從數組的末尾位置(右指針)開始,通過向中間移動來解決問題。


1.1、對撞指針的核心思想

  1. 指針的初始化

    • 左指針 l 指向數組的起始位置(l = 0)。
    • 右指針 r 指向數組的末尾位置(r = nums.size() - 1)。
  2. 指針的移動規則

    • 根據問題的要求,決定左指針或右指針的移動方向。
    • 通常,左指針向右移動,右指針向左移動。
  3. 終止條件

    • 當左指針和右指針相遇或交叉時,算法結束。

1.2、對撞指針的總結

  1. 適用場景

    • 有序數組中的兩數之和、三數之和。
    • 反轉數組或字符串。
    • 驗證回文串。
    • 盛最多水的容器。
  2. 核心思想

    • 使用兩個指針從數組的兩端向中間移動,通過比較指針指向的元素來解決問題。
  3. 時間復雜度

    • 通常為 (O(n)),因為每個元素最多被訪問一次。
  4. 空間復雜度

    • 通常為 (O(1)),只使用了常數級別的額外空間。

2. 快慢指針

快慢指針 是一種常用的雙指針技巧,通常用于解決鏈表或數組中的問題。它的核心思想是使用兩個指針,一個移動速度快(快指針),一個移動速度慢(慢指針),通過它們的相對移動來解決問題。


2.1、快慢指針的核心思想

  1. 快指針和慢指針的移動速度

    • 快指針每次移動兩步。
    • 慢指針每次移動一步。
  2. 相對速度

    • 快指針和慢指針的相對速度是 1,即快指針每次比慢指針多走一步。
  3. 終止條件

    • 當快指針到達鏈表末尾(或數組末尾)時,慢指針通常指向目標位置。

2.2、快慢指針的總結

  1. 適用場景

    • 鏈表中的環檢測、中間節點查找。
    • 數組中的重復元素刪除、重復數查找。
  2. 核心思想

    • 快指針和慢指針以不同的速度移動,通過相對速度解決問題。
  3. 時間復雜度

    • 通常為 (O(n)),因為每個元素最多被訪問兩次。
  4. 空間復雜度

    • 通常為 (O(1)),只使用了常數級別的額外空間。

3. 滑動窗口

3.1、滑動窗口的兩種情況

3.1.1、情況1:固定大小的窗口
  • 特點
    • 窗口的大小是固定的。
    • 通常用于解決需要在固定長度的子數組或子串中查找滿足條件的問題。
  • 示例問題
    • 在一個數組中,找到長度為 k 的連續子數組,使得子數組的和大于 target
  • 解決方法
    • 初始化左指針 l = 0,右指針 r = k - 1
    • 計算窗口內的和,如果滿足條件,返回結果。
    • 如果不滿足條件,移動窗口:l++r++,繼續檢查新的窗口。
3.1.2、情況2:可變大小的窗口
  • 特點
    • 窗口的大小不固定。
    • 通常用于解決需要在不定長度的子數組或子串中查找滿足條件的問題。
  • 示例問題
    • 在一個數組中,找到和大于等于 target 的最短連續子數組。
  • 解決方法
    • 初始化左指針 l = 0,右指針 r = 0
    • 右指針 r 向右移動,擴大窗口,直到窗口內的和滿足條件。
    • 左指針 l 向右移動,縮小窗口,嘗試找到更短的滿足條件的子數組。

3.4、滑動窗口的核心思想

  1. 窗口的定義

    • 窗口是數組或字符串中的一個連續子區間,由左指針 l 和右指針 r 定義。
  2. 窗口的移動

    • 擴大窗口:右指針 r 向右移動,增加窗口的大小。
    • 縮小窗口:左指針 l 向右移動,減少窗口的大小。
  3. 條件的判斷

    • 在窗口移動的過程中,根據問題的要求判斷當前窗口是否滿足條件。

4. 分離指針

分離指針 是一種雙指針技巧,通常用于解決涉及多個數組或鏈表的問題。它的核心思想是使用兩個指針分別遍歷不同的數組或鏈表,通過它們的相對移動來解決問題。


4.1、分離指針的常見應用場景

  1. 合并兩個有序數組或鏈表

    • 將兩個有序數組合并為一個有序數組。
    • 將兩個有序鏈表合并為一個有序鏈表。
  2. 查找兩個數組的交集

    • 找到兩個有序數組的交集。
  3. 判斷一個數組是否是另一個數組的子序列

    • 判斷一個數組是否是另一個數組的子序列。
  4. 滑動窗口問題

    • 使用兩個指針分別表示窗口的左右邊界。

4.2、分離指針的核心思想

  1. 指針的初始化

    • 每個指針分別指向一個數組或鏈表的起始位置。
  2. 指針的移動規則

    • 根據問題的要求,決定每個指針的移動方向。
    • 通常,指針的移動方向是單向的(從左到右)。
  3. 終止條件

    • 當某個指針到達數組或鏈表的末尾時,算法結束。

4.3、分離指針的總結

  1. 適用場景

    • 合并兩個有序數組或鏈表。
    • 查找兩個數組的交集。
    • 判斷一個數組是否是另一個數組的子序列。
  2. 核心思想

    • 使用兩個指針分別遍歷不同的數組或鏈表,通過比較指針指向的元素來解決問題。
  3. 時間復雜度

    • 通常為 (O(m + n)),其中 (m) 和 (n) 是兩個數組或鏈表的長度。
  4. 空間復雜度

    • 通常為 (O(1)),只使用了常數級別的額外空間。

三、 雙指針的時間復雜度

  • 雙指針通常可以將時間復雜度從 (O(n^2)) 優化到 (O(n)),因為每個指針最多遍歷數組或鏈表一次。

四、例題

  • 對撞指針
    力扣hot100兩數之和
  • 快慢指針
    力扣hot100移動零
  • 滑動窗口
    力扣LCR長度最小的子數組
  • 分離指針
    力扣21、合并2個有序鏈表

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/73147.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/73147.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/73147.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LangChain 基礎

一、LangChain 模塊和體系 LangChain 是一個用于開發由大型語言模型(LLMs)驅動的應用程序的框架。 官方文檔:https://python.langchain.com/docs/introduction/ LangChain 簡化了LLM應用程序生命周期的每個階段: 開發&#xf…

#echarts#折線圖#餅圖

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>折線圖</title> </head> <body><div id"app" style"width:100%;height:100%;"><div id"chart-c…

Parsing error: Unexpected token, expected “,“

今天在使用Trae AI 編程工具開發大文件切片上傳功能&#xff0c;使用的是VUE3,TS技術棧&#xff0c;開發完成運行時&#xff0c;編譯報錯&#xff08;Parsing error: Unexpected token, expected ","&#xff09;&#xff0c;讓AI自行修復此問題多次后還是沒有解決&a…

NLP高頻面試題(九)——大模型常見的幾種解碼方案

大模型常見的幾種解碼方案 在自然語言生成任務中&#xff0c;如何從模型生成的概率分布中選擇合適的詞匯&#xff0c;是影響文本質量的關鍵問題。常見的解碼方法包括貪心搜索&#xff08;Greedy Search&#xff09;、束搜索&#xff08;Beam Search&#xff09;、隨機采樣&…

農用車一鍵啟動工作原理

移動管家農用車一鍵啟動的工作原理與普通汽車類似&#xff0c;主要依賴于無線射頻識別技術&#xff08;RFID&#xff09;。以下是具體的工作步驟和原理&#xff1a; 智能鑰匙識別&#xff1a; 車主攜帶智能鑰匙靠近車輛時&#xff0c;鑰匙通過發射射頻信號與車輛進行交互。車輛…

Cursor從小白到專家

文章目錄 1&#xff1a;簡單開發一個貪吃蛇游戲規則設置提示詞 cursor開發小工具開發整體步驟創建.cursorrules輸入提示詞composer模式chat模式 執行cursor accept all發布到線上進行分享 cursor開發一個瀏覽器插件創建.cursorrulescursor rules范例集工具 輸入提示詞執行curso…

MAC+PHY 的硬件連接

文章目錄 以太網的 MAC 與 PHY簡介硬件拓撲CPU集成MAC與PHYCPU集成MAC&#xff0c;PHY采用獨立芯片CPU不集成MAC與PHY&#xff0c;MAC與PHY采用集成芯片 在 OSI 分層中的位置MACPHYMAC 與 PHY 數據交互參考 本文為筆者學習以太網對網上資料歸納整理所做的筆記&#xff0c;文末均…

仿函數 VS 函數指針實現回調

前提&#xff1a; 本博客對比 函數指針實現回調 和 仿函數 &#xff0c;突出仿函數的優勢。 目的&#xff1a; 一個類要能夠靈活的調用兩個函數&#xff0c;essfc 和 greaterfc&#xff0c;分別用于比較兩個整數的大小&#xff1a; ①&#xff1a;lessfc&#xff1a;判斷 x …

CH32V208藍牙內部帶運放32位RISC-V工業級微控制器

開發板 CH32V208CBU6立創格式的開發板上述鏈接可下載&#xff0c;官方文件進行了轉換&#xff0c;使用前請仔細核對。 CH32V208CBU6原理圖&#xff0c;上述圖片為芯片部分。已進行DRC。 CH32V208CBU6 PCB三維圖&#xff0c;上述圖片為芯片部分。已進行DRC。 概述 CH32V208C…

整理和總結微信小程序的高頻知識點

前言 近期萌生了一些想法&#xff0c;感覺可以做一個小程序作為產出。 但小程序做得比較少&#xff0c;因此邊做邊復習。整理和總結了一些高頻知識點和大家一起分享。 一、模板和組件 1.1模板&#xff08;Template&#xff09; 優勢 簡單靈活&#xff1a;模板定義和使用都較…

1996-2023年各省公路里程數據(無缺失)

1996-2023年各省公路里程數據&#xff08;無缺失&#xff09; 1、時間&#xff1a;1996-2023年 2、來源&#xff1a;國家統計局、統計年鑒 3、指標&#xff1a;公路里程&#xff08;萬公里&#xff09; 4、范圍&#xff1a;31省 5、指標解釋&#xff1a;公路里程指報告期末…

SEARCH-R1:大型語言模型的多輪搜索推理革命

當AI學會"邊搜索邊思考" 2025年&#xff0c;語言模型領域迎來重大突破——SEARCH-R1框架通過強化學習&#xff08;RL&#xff09;讓大模型實現"動態搜索自主推理"的協同進化。這項技術不僅讓模型在回答"泰坦尼克號沉沒時的船長是誰"時能自動檢索…

Wi-Fi NAN 架構(Wi-Fi Aware Specification v4.0,第2章:2.7~2.9)

1. NAN 介質訪問控制層&#xff08;MAC&#xff09; NAN MAC負責通過參與 NAN同步信標幀&#xff08;NAN Synchronization Beacon frame&#xff09;的傳輸&#xff0c;獲取并維護設備所在的NAN集群的同步。作為同步功能的一部分&#xff0c;NAN MAC運行 TSF 定時器。NAN MAC還…

基于物聯網的便攜式土壤綜合參數檢測儀設計

標題:基于物聯網的便攜式土壤綜合參數檢測儀設計 內容:1.摘要 隨著農業現代化和環境監測需求的不斷增長&#xff0c;對土壤綜合參數的實時、準確檢測變得至關重要。本研究旨在設計一種基于物聯網的便攜式土壤綜合參數檢測儀&#xff0c;以滿足現場快速檢測和數據遠程傳輸的需求…

《Android 13深度定制:手勢攔截技術實現SystemUI狀態欄智能折疊方案》

核心機制解析 在Android 13的SystemUI定制中&#xff0c;狀態欄下拉行為由NotificationPanelViewController控制&#xff0c;其核心邏輯聚焦于手勢事件處理和布局動態調整。當用戶執行下拉操作時&#xff0c;系統通過onQsIntercept方法攔截滑動事件&#xff0c;并調用setQsExp…

《Python實戰進階》No26: CI/CD 流水線:GitHub Actions 與 Jenkins 集成

No26: CI/CD 流水線&#xff1a;GitHub Actions 與 Jenkins 集成 摘要 持續集成&#xff08;CI&#xff09;和持續部署&#xff08;CD&#xff09;是現代軟件開發中不可或缺的實踐&#xff0c;能夠顯著提升開發效率、減少錯誤并加速交付流程。本文將探討如何利用 GitHub Actio…

2025.3.22總結

今天去了光谷書店&#xff0c;看了下&#xff0c;書店里女生比較多&#xff0c;也不知道是不是上班族&#xff0c;發現有本類似馬克思的書籍&#xff0c;也不知道是不是再考研或者考其他證書的。 圖書館很安靜&#xff0c;安靜的讓我的內心也平靜了下來&#xff0c;我也再一旁…

HR人員和組織信息同步AD域服務器實戰方法JAVA

HR人員和組織信息同步AD域服務器 前期準備AD域基礎知識整理HR同步AD的邏輯代碼結構配置文件設置啟動類HR組織的BeanHR人員Bean獲取HR人員和組織信息的類AD中處理組織和人員的類日志配置 POM.xml文件生成EXE文件服務器定時任務異常問題注意事項 前期準備 1、開發語言&#xff1…

修改服務器windows遠程桌面默認端口號

修改服務器windows遠程桌面默認端口號 在Windows服務器上修改遠程桌面協議&#xff08;RDP&#xff09;的默認端口&#xff08;3389&#xff09;可以增強服務器的安全性&#xff0c;減少被惡意掃描和攻擊的風險。以下是修改遠程端口的詳細步驟&#xff1a; 按 Win R 打開運行…

MuJoCo 仿真 Panda 機械臂!末端位置實時追蹤 + 可視化(含縮放交互)

視頻講解&#xff1a; MuJoCo 仿真 Panda 機械臂&#xff01;末端位置實時追蹤 可視化&#xff08;含縮放交互&#xff09; 倉庫地址&#xff1a;GitHub - LitchiCheng/mujoco-learning 本期介紹下&#xff0c;mujoco_py這個庫很老了&#xff0c;最新的版本可以通過mujoco的p…