C++代碼隨想錄刷題知識分享-----兩數之和(哈希表)三種算法逐個擊破

題目描述

給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和為目標值的那兩個整數,并返回它們的下標

  • 每個輸入只對應一個答案。
  • 同一個元素不能重復使用
  • 你可以按任意順序返回答案。

示例

輸入:

nums = [2, 7, 11, 15], target = 9

輸出:

[0, 1]

解釋: 因為 nums[0] + nums[1] = 2 + 7 = 9,所以返回 [0, 1]


解題思路概覽

我們來介紹三種方法:

方法思路時間復雜度空間復雜度
暴力法雙重遍歷數組所有可能組合O(n2)O(1)
哈希表法(count 寫法)邊遍歷邊用哈希查“補數”O(n)O(n)
哈希表法(find 寫法)使用 find() + insert 更規范O(n)O(n)

方法一:暴力法(Brute Force)

思路:

使用兩層循環,枚舉數組中所有不同的兩元素組合,判斷是否滿足 nums[i] + nums[j] == target

代碼:

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {for (int i = 0; i < nums.size(); ++i) {for (int j = i + 1; j < nums.size(); ++j) {if (nums[i] + nums[j] == target) {return {i, j};}}}return {};}
};

分析:

  • ? 思路直觀,適合入門;
  • ? 時間復雜度高,不適合大數據量。

方法二:哈希表寫法(使用 count()

思路:

  • 用一個哈希表 map 存儲遍歷過的數字及其索引;
  • 每次遍歷當前元素 nums[i] 時,判斷 target - nums[i](即“補數”)是否已經存在于 map 中;
  • 若存在 → 直接返回兩個下標;
  • 若不存在 → 把當前元素加入 map。

代碼:

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> map;  // key: 數值, value: 下標for (int i = 0; i < nums.size(); ++i) {if (map.count(target - nums[i])) {return {map[target - nums[i]], i};}map[nums[i]] = i;  // 記錄當前值及其下標}return {};}
};

分析:

  • ? 查找和插入都為 O(1);
  • ? 非常適合刷題;
  • ? 使用 map[key] 有可能在其他題中產生意外插入。

方法三:哈希表寫法(使用 find() + insert

思路:

與方法二相同,但使用 STL 更推薦的方式:

  • find() 查找 key 是否存在;
  • insert() 插入新元素,避免不小心覆蓋已有值;
  • 更規范、安全,適合用于工程開發或面試展示 STL 掌握能力。

代碼:

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> map;for (int i = 0; i < nums.size(); ++i) {auto iter = map.find(target - nums[i]);  // 查找補數if (iter != map.end()) {return {iter->second, i};  // 返回補數的下標和當前下標}map.insert({nums[i], i});  // 插入當前值}return {};}
};

分析:

  • ? 與方法二效果相同;
  • ? 代碼風格更符合 STL 正統寫法;
  • 🟡 稍微冗長,適合工程/面試環境。

總結對比表

方法時間復雜度空間復雜度是否易懂是否規范是否適合面試
暴力枚舉O(n2)O(1)? 簡單?? 太慢
哈希法(count)O(n)O(n)? 簡潔🟡 有插入副作用? 快速刷題
哈希法(find)O(n)O(n)🟡 略長? 安全規范? 面試優選

一句話總結:

“用哈希表存已經看過的數,找當前數的補數是否在哈希表中” 是兩數之和的核心思路,掌握后可以一鍵通關各類“求和組合”題!

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

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

相關文章

List介紹

什么是List 在集合框架中&#xff0c;List是一個接口&#xff0c;繼承自Collection Collection也是一個接口&#xff0c;該接口中規范了后序容器中常用的一些方法 Iterable也是一個接口&#xff0c;表示實現該接口的類是可以逐個元素進行遍歷的&#xff0c;具體如下&#xff1…

深入理解API:從概念到實戰

引言 在現代軟件開發中&#xff0c;API&#xff08;Application Programming Interface&#xff09;無處不在。無論是調用第三方服務、訪問操作系統功能&#xff0c;還是使用編程語言的標準庫&#xff0c;API 都扮演著關鍵角色。但對于許多初學者來說&#xff0c;API 仍然是一…

織夢dedecms登錄后臺出現Safe Alert Request Error step 2

今天一個客戶在安裝織夢dedecms時候&#xff0c;安裝完成后登錄后臺就出現“Safe Alert Request Error step 2”&#xff0c;常用dedecms的朋友都知道&#xff0c;這是織夢的安全機制&#xff0c;在程序覺得有sql注入等攻擊時候&#xff0c;會有這種提示。 1、起初我以為是文件…

BLIP3-o:理解和生成統一的多模態模型

文章目錄 研究背景BLIP3-o 框架3個關鍵問題BLIP3-o模型總結 paper link: https://arxiv.org/pdf/2505.09568from saleforce research 研究背景 隨著gpt4o圖像生成和編輯的應用火爆&#xff0c;如何構造能夠同時處理圖像理解和生成任務的統一多模態模型&#xff0c;成為研究的…

練習小項目7:天氣狀態切換器

&#x1f9e0; 項目目標&#xff1a; 點擊按鈕切換不同天氣狀態&#xff0c;背景或圖標隨之變化。 ? 功能描述&#xff1a; 顯示當前天氣&#xff08;如&#xff1a;?? 晴天 / ?? 多云 / &#x1f327;? 雨天&#xff09; 點擊“切換天氣”按鈕&#xff0c;每點擊一次…

esp32 lvgl9.2版本,透明底色圖片的,透明部分被渲染成黑色,不隨背景顏色變化解決辦法

在lvgl圖片轉換工具時&#xff0c;指定轉換格式為ARGB8888 代指Alpha RGB RGB565&#xff08;不支持 Alpha&#xff09;&#xff0c;透明像素會被解釋為黑色。改用 ARGB8888。 有問題的 轉換為ARGB8888后的

AI智能分析網關V4區域入侵檢測算法:全功能覆蓋,多場景守護安防安全

一、方案背景? 在當今社會&#xff0c;安全需求日益增長&#xff0c;傳統安防監控系統因效率低、精準度不足等問題&#xff0c;已無法滿足現代安全防范的要求。AI智能分析網關V4區域入侵檢測算法憑借其先進的人工智能技術&#xff0c;能夠實時、精準地識別區域內的異常入侵行…

Phantom 視頻生成的流程

Phantom 視頻生成的流程 flyfish Phantom 視頻生成的實踐 Phantom 視頻生成的流程 Phantom 視頻生成的命令 Wan2.1 圖生視頻 支持批量生成 Wan2.1 文生視頻 支持批量生成、參數化配置和多語言提示詞管理 Wan2.1 加速推理方法 Wan2.1 通過首尾幀生成視頻 AnyText2 在圖片里玩…

瑞薩單片機筆記

1.CS for CC map文件中顯示變量地址 Link Option->List->Output Symbol information 2.FDL庫函數 pfdl_status_t R_FDL_Write(pfdl_u16 index, __near pfdl_u08* buffer, pfdl_u16 bytecount) pfdl_status_t R_FDL_Read(pfdl_u16 index, __near pfdl_u08* buffer, pfdl_…

uniapp+ts 多環境編譯

1. 創建項目 npx degit dcloudio/uni-preset-vue#vite-ts [項目名稱] 2.創建env目錄 多環境配置文件命名為.env.別名 添加index.d.ts interface ImportMetaEnv{readonly VITE_ENV:string,readonly UNI_PLATFORM:string,readonly VITE_APPID:string,readonly VITE_NAME:stri…

英語學習5.24

make informed decisions 表示“做出明智的決定”&#xff0c;是一個常用的固定搭配&#xff0c;常用于議論文中。 …to make informed decisions. 為了做出明智的決定&#xff08;表示目的的動詞不定式&#xff09;。 We need accurate data to make informed decisions. Ci…

【Qt】QImage::Format

QImage::Format 是 Qt 中用于指定圖像像素數據格式的枚舉類型。它決定了圖像如何存儲顏色信息和透明度&#xff08;如果有&#xff09;。選擇合適的 Format 對性能、內存占用以及是否支持某些特性&#xff08;如透明通道&#xff09;有重要影響。 常見的 QImage::Format 枚舉值…

算法筆記·數學·歐拉函數

題目&#xff1a;&#xff08;AcWing&#xff09; 給定 n 個正整數 ai&#xff0c;請你求出每個數的歐拉函數。 歐拉函數的定義 1~N 中與 N 互質的數的個數被稱為歐拉函數&#xff0c;記為 ?(N)。 若在算數基本定理中&#xff0c;N&#xff0c;則&#xff1a; ?(N) N 輸入…

深入理解Redis線程模型

Redis數據 redis數據保存在內存&#xff0c;但是會持久化到硬盤 Redis線程 Redis的整體線程模型可以簡單解釋為 客戶端多線程&#xff0c;服務端單線程。也就是可以多個客戶端同時連接。 核心線程模型&#xff1a;單線程 多路復用 Redis 的主線程負責處理所有客戶端請求&a…

「Python教案」輸入輸出函數的使用

課程目標 1&#xff0e;知識目標 能使用input()輸入函數和print()輸出函數實現人機之間的交互。能夠合理的確定輸入數據的數據類型&#xff0c;并進行數據類型轉換。能夠使用格式化字符串&#xff08;f-string&#xff09;將數據動態輸出。 2&#xff0e;能力目標 能夠使用…

醫療影像中,DICOM點云、三角面片實體混合渲染(VR)

此文章&#xff0c;涉及到專業性比較強&#xff0c;所以&#xff0c;大部分的內容&#xff0c;基本上都是示例代碼的形式出現。以下的技術路徑&#xff0c;完全經過實踐驗證&#xff0c;并且效果很好&#xff0c;可以放心使用。 1 概述 在醫學影像中&#xff0c;對DICOM的渲染…

【C/C++】線程狀態以及轉換

文章目錄 線程狀態以及轉換1 基本狀態1.1 新建&#xff08;New&#xff09;1.2 就緒&#xff08;Ready / Runnable&#xff09;1.3 運行中&#xff08;Running&#xff09;1.4 阻塞/等待&#xff08;Blocked / Waiting / Sleeping&#xff09;1.5 掛起&#xff08;Suspended&am…

Python與自動駕駛數據集處理:構建智能駕駛的基石

Python與自動駕駛數據集處理:構建智能駕駛的基石 在自動駕駛技術的快速發展中,數據始終是最核心的驅動力。自動駕駛系統依賴于大量的傳感器數據(激光雷達、攝像頭、GPS等),通過深度學習算法不斷優化決策,使車輛能夠自主感知、理解道路環境并做出合理決策。而 Python 作為…

【菜狗work前端】小程序加if判斷時不及時刷新 vs Web

零、前提&#xff1a; 實現input輸入數字不大于10000&#xff08;需要配合typenumber&#xff0c;maxlength5&#xff0c;這里沒寫&#xff09; 一、探究代碼&#xff1a; <input v-model"model1" input"changeModel1" placeholder"請輸入拒收件…

【Netty】- NIO基礎2

阻塞模式 客戶端代碼 public class Client {public static void main(String[] args) throws IOException {SocketChannel sc SocketChannel.open();sc.connect(new InetSocketAddress("localhost", 8080));// sc.write(Charset.defaultCharset().encode("he…