[優選算法專題一雙指針——兩數之和](雙指針和哈希表)

題目鏈接

LeetCode兩數之和

題目描述

題目解析

注意:前提條件:輸入的數組numbers是已排序的。

核心思路:雙指針法

利用數組已排序的特性,通過兩個指針從兩端向中間移動,快速定位符合條件的兩個數,時間復雜度為O(n)(n 為數組長度),空間復雜度為O(1),比哈希表解法更優。

具體步驟:

  1. 初始化指針

    • left指針指向數組起始位置(下標 0)。
    • right指針指向數組末尾位置(下標numbers.size()-1)。
  2. 循環查找目標和

    • 計算兩指針指向元素的和sum = numbers[left] + numbers[right]
    • sum > target:說明右側元素過大,將right指針左移(right--),減小總和。
    • sum < target:說明左側元素過小,將left指針右移(left++),增大總和。
    • sum == target:找到符合條件的兩個元素,返回它們的下標(注意 + 1,因為題目要求從 1 開始計數)。
  3. 邊界處理

    • 若循環結束仍未找到(理論上題目保證有解,此步可省略),返回{-1, -1}

示例說明:

假設輸入:numbers = [2, 7, 11, 15]target = 9

  • 初始left=0(值 2),right=3(值 15),sum=17 > 9?→?right--(指向 11)。
  • sum=2+11=13 > 9?→?right--(指向 7)。
  • sum=2+7=9 == target?→ 返回{0+1, 1+1} = {1, 2}

完整代碼

復雜度分析

1. 時間復雜度:O (n)

  • 分析:算法使用雙指針(left?和?right)從數組兩端向中間移動,每次循環僅移動一個指針,直到兩指針相遇(left >= right)。
  • 最壞情況:兩個指針總共移動的次數不會超過數組長度?n(例如,目標值需要最小元素和最大元素相加時,指針從兩端移動到相遇,總步數為?n?級)。
  • 結論:時間復雜度為?O(n),其中?n?是數組?numbers?的長度。

2. 空間復雜度:O (1)

  • 分析:算法僅使用了常數個額外變量(leftrightsum),沒有使用與輸入規模相關的額外空間(如哈希表、數組等)。
  • 結論:空間復雜度為?O(1),屬于原地(in-place)算法。

如果是無序的,這里我們可以使用哈希表來解決!

哈希表法(無序)

解法思路:哈希表(空間換時間)

這個解法的核心是利用?哈希表(unordered_map)?存儲已經遍歷過的元素及其下標,通過一次遍歷就能找到答案,避免了暴力解法的二次循環。

具體邏輯:

  1. 遍歷數組中的每個元素?nums[j]j?是當前下標)
  2. 計算與當前元素互補的數值:complement = target - nums[j]
  3. 檢查哈希表中是否存在?complement

  • 若存在,說明之前已經遍歷過值為?complement?的元素(下標為?i),則?i?和?j?就是答案
  • 若不存在,將當前元素?nums[j]?和其下標?j?存入哈希表,繼續遍歷

代碼執行流程(分步演示)

  • 我們以?nums = [5, 4, 3, 2, 8]?且?target = 12?為例,詳細演示代碼的執行過程。

    預期結果

    在這個例子中,數組中?4 + 8 = 12,對應的下標是?1?和?4,因此最終應該返回?[1, 4]

    代碼執行步驟拆解

    我們按照代碼的執行順序,一步步分析哈希表的變化和每輪循環的操作:

    • 初始化

      • 創建空哈希表?idx = {}(用于存儲已遍歷元素的值和下標)
      • 循環變量?j?從?0?開始
    • 第一輪循環(j=0,當前元素 nums [0]=5)

      • 計算互補值:complement = target - nums[j] = 12 - 5 = 7
      • 檢查哈希表?idx?中是否存在?7:此時哈希表為空,未找到
      • 將當前元素存入哈希表:idx[5] = 0(現在哈希表為?{5:0}
      • 繼續下一輪循環
    • 第二輪循環(j=1,當前元素 nums [1]=4)

      • 計算互補值:complement = 12 - 4 = 8
      • 檢查哈希表?idx?中是否存在?8:當前哈希表只有?5,未找到
      • 將當前元素存入哈希表:idx[4] = 1(現在哈希表為?{5:0, 4:1}
      • 繼續下一輪循環
    • 第三輪循環(j=2,當前元素 nums [2]=3)

      • 計算互補值:complement = 12 - 3 = 9
      • 檢查哈希表?idx?中是否存在?9:哈希表中只有?5?和?4,未找到
      • 將當前元素存入哈希表:idx[3] = 2(現在哈希表為?{5:0, 4:1, 3:2}
      • 繼續下一輪循環
    • 第四輪循環(j=3,當前元素 nums [3]=2)

      • 計算互補值:complement = 12 - 2 = 10
      • 檢查哈希表?idx?中是否存在?10:哈希表中沒有?10,未找到
      • 將當前元素存入哈希表:idx[2] = 3(現在哈希表為?{5:0, 4:1, 3:2, 2:3}
      • 繼續下一輪循環
    • 第五輪循環(j=4,當前元素 nums [4]=8)

      • 計算互補值:complement = 12 - 8 = 4
      • 檢查哈希表?idx?中是否存在?4:此時哈希表中存在?4,對應的下標是?1(即?idx[4] = 1
      • 找到答案,直接返回?[1, 4](互補元素的下標?1?和當前元素的下標?4
      • 程序結束

代碼細節解析

完整代碼

  • 哈希表的作用

    • unordered_map<int, int> idx?中,key 是數組元素的值,value 是該元素的下標
    • 哈希表的查找操作是?O(1)?時間復雜度,比數組查找(O (n))快得多
  • 循環設計

    • 原代碼中的?for (int j = 0; ; j++)?其實隱含了?j < nums.size()?的條件(題目保證有解,所以一定會在循環內返回)
    • 標準寫法應該是?for (int j = 0; j < nums.size(); j++),更嚴謹
  • 避免重復使用元素

    • 因為我們是先檢查哈希表,再將當前元素存入哈希表,所以哈希表中永遠只包含「當前元素之前的元素」
    • 這就保證了不會出現「自己和自己相加」的情況(例如?nums = [3,3]?時,第一個 3 存入哈希表后,第二個 3 才會查找并命中)
  • 返回值

    • 題目保證有且僅有一個解,所以循環內一定會找到答案并返回
    • 理論上不需要最后的?return {},但為了滿足 C++ 語法(函數必須有返回值),通常會加上

時間復雜度為 O(n)

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

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

相關文章

佳維視高亮度工業顯示器,強光環境清晰可見

在工業、戶外或高光照場景中&#xff0c;普通顯示器常因環境光干擾導致畫面模糊、色彩失真&#xff0c;甚至無法操作。高亮度工業顯示器通過技術優化與專業設計&#xff0c;突破光線限制&#xff0c;確保在強光下仍能呈現清晰、穩定的視覺效果&#xff0c;成為關鍵任務環境中的…

系統的緩存(buff/cache)是如何影響系統性能的?

系統的緩存&#xff08;buff/cache&#xff0c;包括 buffer 和 cache&#xff09;是 Linux 內核為提升系統性能設計的關鍵機制&#xff0c;其對性能的影響主要體現在加速數據訪問和平衡內存與磁盤速度差異上&#xff0c;具體如下&#xff1a; 一、buff/cache 的本質&#xff1a…

淺析 Berachain v2 ,對原有 PoL 機制進行了哪些升級?

Berachain 本身是一個特色鮮明的 Layer1 區塊鏈項目&#xff0c;其最具辨識度的創新在于采用了 PoL&#xff08;Proof of Liquidity&#xff09;區塊獎勵分配機制。該機制把鏈的區塊獎勵轉化為生態增長動力的協議內經濟機制&#xff0c;通過將絕大部分獎勵直接分配給生態中的用…

校招秋招春招小米在線測評小米測評題庫|測評解析和攻略|題庫分享

秒收測評 小米校招投遞簡歷之后會立馬收到在線測評&#xff0c;在線測評考察的內容就是行測和性格測試。 具體內容 小米在線測評有五部分組成&#xff0c;其中第一、二、三部分各限時 10 分鐘&#xff0c;并且每題只有 70 秒左右&#xff0c;時間到自動跳到下一題&#xff0…

遮天(帝國篇)

距離軒轅鴻天成為道盟盟主已經過去了三十年&#xff0c;卡薩帝國國君卡薩也在一次戰爭中被妖族所殺&#xff0c;留下了兩個年幼的兒子&#xff0c;長子卡利爾&#xff0c;次子卡修。 卡薩死后一直是大將軍戈隆掌控帝國事務&#xff0c;戈隆秉承著道盟見妖就殺的理念讓卡薩帝國成…

批量將NC格式數據轉換為TIF格式:解決轉換后圖像顛倒、鏡像、翻轉等問題

本文介紹基于Python中GDAL模塊&#xff0c;批量將大量.nc格式的柵格文件轉換為.tif格式&#xff0c;并解決可能出現的轉換后圖像顛倒、鏡像、翻轉等問題。最近&#xff0c;需要批量將大量.nc格式的柵格文件轉換為.tif格式。如下圖所示&#xff0c;有多個待轉換的.nc格式文件&am…

《論三生原理》重構數學哲學基礎語義場??

AI輔助創作&#xff1a;《論三生原理》通過算法化轉譯傳統文化符號、重構數學對象本體論及創新術語體系&#xff0c;系統性重構數學哲學基礎語義場&#xff0c;其核心路徑如下&#xff1a;&#x1f50d; 一、哲學符號的數學實體化?陰陽范疇的數理轉譯?將《周易》“陰/陽”抽象…

適用于在線3D測量和檢測的3D激光輪廓儀

Z-Trak? Express 1K5 系列是Z-Trak系列中的最新創新成果&#xff0c;專為實現經濟高效的在線3D測量和檢測而設計&#xff0c;在整個測量范圍內可實現每秒最多 5,000 個輪廓的測量速率&#xff0c;具有高速檢測能力和實時處理性能。Z-Trak? Express 1K5系列 3D激光輪廓儀Z-Tra…

主播生活模擬器2|主播人生模擬器2 (Streamer Life Simulator 2)免安裝中文版

網盤鏈接&#xff1a; 七主播生活模擬器2|主播人生模擬器2 名稱&#xff1a;七主播生活模擬器2|主播人生模擬器2 &#xff08;Streamer Life Simulator 2&#xff09;免安裝中文版 描述&#xff1a;《主播人生模擬器》是一款從零開始&#xff0c;努力成為一名受歡迎的網絡主…

解決React白板應用中的畫布內容丟失問題

解決React白板應用中的畫布內容丟失問題 在開發基于React的在線白板應用時&#xff0c;我們遇到了一個棘手問題&#xff1a;當用戶滾動到底部自動擴展畫布時&#xff0c;原有繪制內容會神秘消失。經過系統排查&#xff0c;最終通過Canvas API的巧妙運用解決了這個問題。以下是完…

韓國寶藍集團與Alpha World、非小號Alpha正式達成戰略合作

2025年8月1日&#xff0c;Boram Group(寶藍集團)旗下Boram Sangjo特銷團隊正式宣布&#xff0c;已與全球Web3平臺 Alpha World 以及加密數據平臺 非小號Alpha&#xff08;FXH Alpha&#xff09;達成三方戰略合作。始于1991–1992年創立的 Boram Sangjo Development隸屬于Boram …

手動開發一個TCP服務器調試工具(二):無界面 TCP 通信服最小實現

本篇將講解如何使用 Qt 構建一個簡單但完整的TCP 服務端&#xff0c;無需圖形界面。? 程序功能概覽 啟動一個監聽本地 12345 端口的 TCP 服務&#xff1b;有客戶端連接時輸出信息&#xff1b;每秒向客戶端發送一次當前時間&#xff1b;支持接收客戶端數據&#xff1b;客戶端斷…

??大語言模型(LLM)實戰應用:從微調到部署全流程??

摘要?? 大語言模型&#xff08;LLM&#xff09;已成為AI落地的核心驅動力&#xff0c;但其從預訓練狀態到生產環境的轉化仍面臨技術復雜度高、資源消耗大等挑戰。本文系統梳理LLM實戰全流程&#xff0c;涵蓋??微調策略選擇??、??量化壓縮技術??、??部署優化方案??…

基于Web的交互式坐標系變換矩陣計算工具

基于Web的交互式坐標系變換矩陣計算工具一、什么是坐標系變換矩陣&#xff1f;二、為什么需要這個工具&#xff1f;三、效果四、功能介紹1、坐標系定義2、交互控制3、變換矩陣計算五、如何使用這個工具六、完整代碼七、總結一、什么是坐標系變換矩陣&#xff1f; 在三維空間中…

【C++】類和對象--類中6個默認成員函數(2) --運算符重載

目錄 問題引入 1. 運算符重載 問題引入 在C中&#xff0c;我們之前講過了&#xff0c;一個類中什么都沒有&#xff0c;我們將其稱作空類。但是我們之前提到過&#xff0c;就算我們在類中什么也不定義&#xff0c;編譯器會自動生成6個默認的成員函數&#xff1a;構造函數、析構…

阿里云OSS vs 騰訊云COS深度對比:如何為網站靜態資源選擇最佳對象存儲?

你的服務器&#xff0c;是不是感覺越來越“累”了&#xff1f;最開始&#xff0c;你只是在上面跑一個簡單的博客&#xff0c;它健步如飛。后來&#xff0c;你的網站內容越來越豐富&#xff0c;圖片越來越多&#xff0c;主題越來越炫酷&#xff0c;你慢慢發現&#xff0c;網站的…

排序知識總結

排序的概念及引用排序是使一串記錄&#xff0c;按照某個關鍵字的大小&#xff0c;遞增或遞減排列起來的操作穩定性&#xff1a;相同關鍵字排序前后相對順序不變內部排序&#xff1a;數據元素全部放在內存中排序外部排序&#xff1a;數據太多不能同時放到內存中&#xff0c;根據…

rebase 和pull的通俗區別是什么

目錄 Git中rebase與pull的通俗區別 簡單比喻 主要區別 使用場景 通俗例子 git rebase 使用例子 &#x1f3af; 目標 &#x1f9ea; 場景設定 &#x1f9f0; 操作步驟 1?? 你切換到 feature 分支 2?? 更新遠程代碼 3?? 進行 rebase 操作 &#x1f504; 變化后…

微信小程序功能 表單密碼強度驗證

一、頁面展示與交互功能表單提交與驗證&#xff08;含密碼強度驗證&#xff09;實現帶密碼強度驗證的表單提交功能&#xff0c;使用正則表達式檢查密碼復雜度&#xff1a;<form bindsubmit"submitForm"><input name"username" placeholder"請…

【谷歌 SEO】排查頁面未索引問題:原因與解決方案

你在谷歌網站SEO優化時是否遇到以下情況&#xff1f; 為什么&#xff0c;即使我已經正確地編寫了站點地圖并將其鏈接到客戶的網站&#xff0c;并且我已經檢查了所有內容&#xff0c;但我是否在某些文章&#xff08;不是所有文章&#xff09;上遇到索引問題&#xff0c;即使在向…