【LeetCode 熱題 100】1. 兩數之和——(解法二)哈希表

Problem: 1. 兩數之和

文章目錄

  • 整體思路
  • 完整代碼
  • 時空復雜度
    • 時間復雜度:O(N)
    • 空間復雜度:O(N)

整體思路

這段代碼旨在高效地解決 “兩數之和” 問題。與 O(N^2) 的暴力枚舉法相比,此版本采用了一種經典的 “空間換時間” 策略,利用 哈希表 (HashMap) 將時間復雜度優化到了線性級別 O(N)。

該算法的核心思想是,在遍歷數組的同時,利用哈希表快速查找每個數字所需的“另一半”。

算法的邏輯步驟可以分解如下:

  1. 數據結構選擇

    • 算法選擇 HashMap 作為核心數據結構。這個哈希表將用于存儲已經遍歷過的數字及其對應的索引,即 (數字 -> 索引) 的鍵值對。
    • 目的:哈希表提供了平均時間復雜度為 O(1) 的查找操作。這使得我們能夠即時地回答“我們之前是否見過某個數字?”這個問題。
  2. 單次遍歷與查找

    • 算法只需對 nums 數組進行一次 for 循環遍歷。
    • 在循環的每一步(對于當前數字 nums[i]),算法執行兩個核心操作,且順序非常關鍵:
      a. 計算并查找“補數”:首先,計算出要與 nums[i] 相加才能得到 target 的那個“補數” other,即 other = target - nums[i]。然后,算法立即在哈希表中檢查是否存在這個 other
      b. 處理查找結果
      • 如果找到了 (map.containsKey(other)):這意味著 other 這個數字在數組的前面部分(0i-1 的索引中)已經出現過。我們已經找到了解!此時,直接返回 other 的索引(從哈希表中獲取 map.get(other))和當前數字的索引 i
      • 如果沒有找到:這意味著在已經遍歷過的數字中,沒有 nums[i] 的“另一半”。那么,nums[i] 本身可能就是未來某個數字的“另一半”。因此,算法將當前數字 nums[i] 及其索引 i 存入哈希表中,以供后續的迭代查找。
  3. 返回結果

    • 由于題目保證有且僅有一個解,if 條件一定會在某個時刻被滿足并返回結果。因此,理論上最后的 return null; 是不可達的(但在語法上是必需的,以防編譯器報錯)。

通過這種“邊遍歷邊記錄”的方式,算法將尋找配對數的過程從 O(N) 的線性掃描縮短為 O(1) 的哈希查找,從而實現了整體性能的飛躍。

完整代碼

import java.util.HashMap;
import java.util.Map;class Solution {/*** 在數組中找出和為目標值的兩個數的索引。* @param nums 整數數組* @param target 目標和* @return 包含兩個索引的數組,如果不存在則返回 null*/public int[] twoSum(int[] nums, int target) {int n = nums.length;// map: 用于存儲已遍歷過的數字及其索引。// Key: 數組中的數字// Value: 該數字對應的索引Map<Integer, Integer> map = new HashMap<>();// 單次遍歷數組for (int i = 0; i < n; i++) {// 計算當前數字 nums[i] 需要配對的“另一半”int other = target - nums[i];// 關鍵步驟:檢查“另一半”是否已經存在于哈希表中// 這是 O(1) 的高效查找操作if (map.containsKey(other)) {// 如果存在,說明我們找到了解。// map.get(other) 是“另一半”的索引,i 是當前數字的索引。return new int[]{map.get(other), i};}// 如果“另一半”不存在,則將當前數字和它的索引存入哈希表,// 以便后續的元素可以查找它作為配對。map.put(nums[i], i);}// 根據題目假設,總會有一個解,所以理論上不會執行到這里。return null;}
}

時空復雜度

時間復雜度:O(N)

  1. 循環:算法的核心是一個 for 循環,它嚴格地遍歷 nums 數組一次。如果數組的長度為 N,這個循環將執行 N 次。
  2. 循環內部操作
    • 在循環的每一次迭代中,執行的主要操作是 map.containsKey()map.put()
    • 對于 HashMap,這兩個操作的平均時間復雜度都是 O(1)
    • 其余的算術和賦值操作也是 O(1)。

綜合分析
算法由 N 次 O(1) 的操作組成。因此,總的時間復雜度是 N * O(1) = O(N)

空間復雜度:O(N)

  1. 主要存儲開銷:算法使用了一個哈希表 map 來存儲已經遍歷過的數字和它們的索引。
  2. 空間大小:在最壞的情況下(例如,解在數組的最后兩個元素,或者無解),哈希表需要存儲 N-1N 個鍵值對。因此,哈希表占用的空間與輸入數組 nums 的大小 N 成線性關系。

綜合分析
算法所需的額外空間主要由哈希表 map 決定。因此,其空間復雜度為 O(N)

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

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

相關文章

MySQL主從同步--主從復制進階

MySQL支持一臺主庫同時向多臺從庫進行復制&#xff0c;從庫同時也可以作為其他從服務器的主庫&#xff0c;實現鏈狀復制。1、MySQL支持的binlog二進制日志復制類型- 基于語句&#xff08;statement&#xff09;的復制在主服務器上執行SQL語句&#xff0c;在從服務器上執行同樣的…

WPF外部打開html文件

注意&#xff1a;這是一份提供WPF外部瀏覽器打開html的方法&#xff0c;而不是WPF內部嵌入html 需要通過瀏覽器打開&#xff0c;否則無法使用地址欄拼接參數的形式操作html 下面是打開html的方法↓string localHtmlPath "C:\Users\pangb\Downloads\Help\幫助文檔 - 副本.…

Go初級之十:錯誤處理與程序健壯性

Go初級之十&#xff1a;錯誤處理與程序健壯性為什么選這個主題&#xff1f; 錯誤處理是 Go 語言中一個非常獨特且重要的設計哲學。它體現了 Go 的“顯式錯誤處理”思想&#xff0c;與其它語言&#xff08;如 Java/Python&#xff09;的異常機制不同。在實際開發中&#xff0c;幾…

Xsens解碼人形機器人訓練的語言

隨著人形機器人在現實世界的應用中變得越來越普遍&#xff0c;了解實現其類似人類運動的技術至關重要。在Xsens我們滿懷熱情地探索這一領域&#xff0c;致力于為人形機器人訓練開發最佳的動作捕捉解決方案。為了幫助您更好地理解所遇到的術語&#xff0c;我們創建了一份概述&am…

25年下載chromedriver.140

前提&#xff1a; 因為我需要用seleium模擬瀏覽器獲取數據&#xff0c;需要用到這個chromedriver 驅動。 1.chrome瀏覽器版本號 先檢查你的chrome 的版本號是多少&#xff0c;就下載對應的 chromedriver 【三個點】--->【幫助】------>【關于 Google chrome 】 我的版本…

深度學習玩游戲, 模型玩游戲,大模型+游戲 llm+game, 機器學習玩游戲,人工智能游戲陪伴,模型陪玩游戲

1. 論文地址 Think in Games: Learning to Reason in Games via Reinforcement Learning with Large Language Models 2. 中文&#xff1a; Think in Games&#xff1a;做一個在王者榮耀中會玩和思考的Agent 3. 我記得幾年前&#xff0c;相關文章還是使用dqn算法。玩雅利達小…

并查集|棧

lc1668不能直接跳class Solution { public:int maxRepeating(string sequence, string word) {int k 0, n sequence.size(), wn word.size(), t 0;for (int i 0; i < n - wn; i) {if (sequence.substr(i, wn) word) {t 1;int j i wn;while (j wn < n &&…

問題三ai思路

好的&#xff0c;我把“路線A&#xff1a;分類建模擇時”的代碼按功能分段給出&#xff0c;并為每段配上簡明解釋。你可以將這些段落依次粘貼到已完成清洗后的 df 變量之后直接運行。 0. 依賴導入&#xff08;一次即可&#xff09; 作用&#xff1a;導入所需庫&#xff1b;后續…

Java第十四幕集合啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦

集合1 Collection接口1.1 集合概述集合是一個裝對象的容器。集合中只能存放引用數據類型的對象。集合中有一些大小是固定的&#xff0c;有一些是不固定的。有一些是有序的&#xff0c;有些是無序的。有些可以有重復元素&#xff0c;有一些不可以有重復元素1.2 集合常用方法publ…

硬件基礎:串口通信

數據傳輸方式&#xff08;按位傳輸方式&#xff09;并行通信通過多條數據線同時傳輸多個數據位&#xff0c;速度較快但成本高&#xff0c;抗干擾能力弱&#xff0c;適用于短距離通信&#xff0c;如早期的打印機接口。串行通信通過單條或少數數據線逐位傳輸數據&#xff0c;線路…

從Java全棧到云原生:一場技術深度對話

從Java全棧到云原生&#xff1a;一場技術深度對話 面試官與應聘者互動記錄 面試官&#xff1a;你好&#xff0c;歡迎來到我們的面試。先簡單介紹一下你自己吧。 應聘者&#xff1a;您好&#xff0c;我叫李明&#xff0c;28歲&#xff0c;碩士學歷&#xff0c;有5年Java全棧開發…

158-EEMD-HHT算法

158-EEMD-HHT#EMD #希爾伯特變換-&#xff08;Hilbert- Huang Transform&#xff0c;HHT&#xff09;#集合經驗模態分解 EEMD #時頻分析 #邊際譜代碼描述1、利用 集合經驗模態分解&#xff08;EEMD&#xff09;方法對信號進行分解&#xff0c;得到模態分量 IMF&#xff1b;2、計…

C#開發中的 token

C# 開發中的 Token 詳解 C# 開發中的 Token 詳解與示例 1. CancellationToken - 異步取消令牌 示例 1:基礎取消機制 示例 2:Web API 中的請求取消 2. JWT Token - 身份驗證令牌 示例 1:JWT Token 生成與驗證 示例 2:ASP.NET Core JWT 認證配置 3. Access Token - API 訪問令…

旅游安全急救實訓室助力應急處置技能實戰化

隨著旅游行業的快速發展&#xff0c;游客安全需求日益突出&#xff0c;應急處置能力已成為旅游服務人才的核心素養之一。在中職教育旅游服務與管理專業中&#xff0c;旅游安全急救實訓室作為關鍵教學場所&#xff0c;正發揮著不可替代的作用。一、旅游安全急救實訓室的建設背景…

分布式微服務--ZooKeeper的客戶端常用命令 Java API 操作

一、ZooKeeper 客戶端常用命令 1. 啟動與退出 bin/zkCli.sh -server 127.0.0.1:2181 # 連接客戶端 quit # 退出客戶端2. 節點操作 # 查看子節點 ls / ls -s / ls /app# 查看節點詳細信息 ls2 /app stat /app# 創建節點 create /node1 "…

PID控制技術深度剖析:從基礎原理到高級應用(六)

PID 控制技術深度剖析&#xff1a;從基礎原理到高級應用 最近在項目中有要開始進行PID的控制了&#xff0c;隔了很久沒有做PID控制的東西了&#xff0c;所以想正好借這個機會&#xff0c;溫習一下和PID有關的內容。 系列文章目錄 PID控制技術深度剖析&#xff1a;從基礎原理到…

PCL關鍵點提取

1. 核心概念:什么是關鍵點?為什么需要關鍵點? 關鍵詞:信息冗余、計算效率、突出特征 “想象一下,我們有一片密集的點云,包含幾十萬個點。如果我們直接在每個點上都計算像FPFH這樣的局部特征,計算量會非常大,極其耗時,而且很多點所處的區域(比如平坦的墻面)特征非常…

vcruntime140_1.dll缺失怎么辦?暗黑破壞神游戲vcruntime140_1.dll缺失的4個解決方法

你是否遇到過這樣的情況&#xff1a; 玩《暗黑破壞神》《英雄聯盟》《GTA5》的時候&#xff0c;游戲忽然閃退&#xff0c;彈窗提示&#xff1a; “無法啟動&#xff0c;因為計算機中丟失 vcruntime140_1.dll” 這不是某一個游戲的問題&#xff0c;而是 Windows 系統運行庫缺失…

遷移學習-ResNet

好的&#xff0c;我將為你撰寫一篇關于ResNet遷移學習的技術博客。以下是博客的主要內容&#xff1a;ResNet遷移學習&#xff1a;原理、實踐與效果深度解析1. 深度學習中遷移學習的重要性與ResNet的獨特價值遷移學習&#xff08;Transfer Learning&#xff09;是機器學習中一種…

極大似然估計與概率圖模型:統計建模的黃金組合

在數據驅動的時代&#xff0c;如何從海量信息中提取有價值的規律&#xff1f;統計建模提供了兩大核心工具&#xff1a;極大似然估計&#xff08;MLE&#xff09;幫助我們根據數據推斷模型參數&#xff0c;而概率圖模型&#xff08;PGM&#xff09;則通過圖形化語言描述變量間的…