哈希經典題目(C++)

文章目錄

  • 前言
  • 一、兩數之和
    • 1.題目解析
    • 2.算法原理
    • 3.代碼編寫
  • 二、判定是否互為字符重排
    • 1.題目解析
    • 2.算法原理
    • 3.代碼編寫
  • 三、 字?異位詞分組
    • 1.題目解析
    • 2.算法原理
    • 3.代碼編寫
  • 總結


前言

哈希表是一個存儲數據的容器,我們如果想要快速查找某個元素,就可以用哈希表,時間復雜度為O(1)。

一、兩數之和

1.題目解析

給定一個整數數組 nums 和一個整數目標值 target,請你在該數組中找出 和為目標值 target 的那 兩個 整數,并返回它們的數組下標。
你可以假設每種輸入只會對應一個答案。但是,數組中同一個元素在答案里不能重復出現。
你可以按任意順序返回答案。

示例 1:
輸入:nums = [2,7,11,15], target = 9
輸出:[0,1]
解釋:因為 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:
輸入:nums = [3,2,4], target = 6
輸出:[1,2]

示例 3:
輸入:nums = [3,3], target = 6
輸出:[0,1]

提示:

2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只會存在一個有效答案

2.算法原理

暴力解法

我們這里有兩種暴露解法

解法一:

在這里插入圖片描述

我們先固定right,left從right位置開始,一直尋找到n-1的位置。如果在某個位置發現了left+right=target。我們就返回這兩個下標。否則right++,left=right,繼續尋找。一直走到right=n-1為止。

解法二:

在這里插入圖片描述

我們同樣先固定right, left從0為止開始,一種走到right-1為止。
中間如果找到滿足條件的就返回,如果找不到就繼續right++,left從0為止開始尋找。一直走到right=n-1為止。

這兩種算法時間復雜度為O(n*n),空間復雜度為O(1)

哈希解法

我們利用哈希表可以快速查找到一個值。

我們遇到一個值,先這個值與前面的值進行判斷,查看是否有滿足條件的。如果不滿足,我們把這個值仍在哈希表中繼續判斷。

如果我們對另一種暴力解法進行優化,我們需要先把整個元素放在哈希表中,再進行二次遍歷,因為可能存在元素相同的情況。
比如nums[ ]={2,4,6,-2,10};taarget=8.
r如果我們先固定4時,快速查找一遍,我們就會找到4,這就重復了,題目要求數組中同一個元素在答案里不能重復出現。
我們就只能另加判斷處理了。

我們采用這種方法,將元素放入hash,同時見擦汗表中是否已經存在了當前元素所對應的目標元素(t-nums[ i ]),提高效率。

時間復雜度為O(n),空間復雜度O(n),空間換時間。

3.代碼編寫

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {//通過一個值快速查找到它的下標unordered_map<int,int>mp;int n=nums.size();for(int i=0;i<n;i++){int x=target-nums[i];if(mp.count(x)){return {i,mp[x]};}mp[nums[i]]=i;}return  {-1,-1};}
};

二、判定是否互為字符重排

1.題目解析

給定兩個由小寫字母組成的字符串 s1 和 s2,請編寫一個程序,確定其中一個字符串的字符重新排列后,能否變成另一個字符串。

示例 1:
輸入: s1 = “abc”, s2 = “bca”
輸出: true

示例 2:
輸入: s1 = “abc”, s2 = “bad”
輸出: false

說明:
0 <= len(s1) <= 100
0 <= len(s2) <= 100

2.算法原理

如果能夠構成重排,哪個字符串中每個字符出現的次數一定是相同的。

解法1:STL中哈希
我們可以用兩個庫里的哈希表實現,s1和s2都丟到哈希表中,遍歷一遍,判斷每個元素的個數是否相同。
這樣做很復雜

解法2:數組模擬哈希表

本道題目明確說明了都是小寫字母,我們可以開一個大小為26的數組,模擬哈希表的完成。我們只需要進行26次判斷就可以了。

解法3:一個哈希表解決

我們可以在第二個解法的基礎上,用一個數組完成。
先把s1中的字母放到數組中,再對s2進行遍歷,如果在數組中,就進行減減操作。如果減到負數了,說明不匹配,返回false。

小優化:如果s1和s2長度都不相同,肯定不符合要求。
時間復雜度O(n),空間復雜度O(26)

3.代碼編寫

class Solution {
public:bool CheckPermutation(string s1, string s2) {//小優化if(s1.size()!=s2.size()){return false;}int hash[26]={0};//s1存元素for(auto&e:s1){hash[e-'a']++;}//s2進行--判斷for(auto&e:s2){if((--hash[e-'a'])<0){return false;}}return true;}
};

三、 字?異位詞分組

1.題目解析

給你一個字符串數組,請你將 字母異位詞 組合在一起。可以按任意順序返回結果列表。
字母異位詞 是由重新排列源單詞的所有字母得到的一個新單詞。

示例 1:
輸入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
輸出: [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]]

示例 2:
輸入: strs = [“”]
輸出: [[“”]]

示例 3:
輸入: strs = [“a”]
輸出: [[“a”]]

提示:
1 <= strs.length <= 104
0 <= strs[i].length <= 100
strs[i] 僅包含小寫字母

2.算法原理

互為字母異位詞:排完序之后兩個單詞應該完全相同
我們可以利用這個特性,將單詞按照字典序排序。
排序后,單詞相同的話,就劃分到同一組中。

排序后單詞與原單詞需要互相映射,我們可以用哈希表完成。
相同的單詞劃分到一組,我們可以用vector完成。

3.代碼編寫

class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {unordered_map<string,vector<string>>mp;//所有字母異位詞分組for(auto&e:strs){//排序string s=e;sort(s.begin(),s.end());mp[s].push_back(e);}//提取結果vector<vector<string>>ret;for(auto& [x,y] : mp){ret.push_back(y);}return ret;}
};

for(auto& [x,y] : mp)注意一下這種寫法

總結

以上就是今天要講的內容。希望對大家的學習有所幫助,僅供參考 如有錯誤請大佬指點我會盡快去改正 歡迎大家來評論~~ 😘 😘 😘

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

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

相關文章

Python驅動下的AI革命:技術賦能與案例解析

在當今這個信息化、數據化的時代&#xff0c;人工智能&#xff08;AI&#xff09;已經成為推動社會發展的重要力量。而Python&#xff0c;作為一種簡單易學、功能強大的編程語言&#xff0c;在AI領域的應用中發揮著至關重要的作用。本文將探討Python在AI領域的應用、其背后的技…

MMUNet:形態學特征增強網絡在結腸癌病理圖像分割中的應用

MMUNet: Morphological feature enhancement network for colon cancer segmentation in pathological images. 發表在&#xff1a;Biomedical Signal Processing and Control2024--影響因子&#xff1a;3.137 南華大學的論文 論文地址&#xff1a;main.pdf (sciencedirecta…

Wakeup Source框架設計與實現

Wakeup Source 為系統組件提供了投票機制&#xff0c;以便低功耗子系統判斷當前是否可以進入休眠。 Wakeup Source(后簡稱&#xff1a;WS) 模塊可與內核中的其他模塊或者上層服務交互&#xff0c;并最終體現在對睡眠鎖的控制上。 1. 模塊功能說明 WS的處理邏輯基本上是圍繞 com…

后端進階-分庫分表

文章目錄 為什么需要分庫為什么需要分表 什么時候需要分庫分表只需要分庫只需要分表 分庫分表解決方案垂直分庫水平分庫垂直分表水平分表 分庫分表常用算法范圍算法hash分片查表分片 分庫分表模式客戶端模式代理模式 今天跟著訓練營學習了分庫分表&#xff0c;整理了學習筆記。…

機器學習模型進行預測和回測

這段代碼是為了并行地處理多個 CSV 文件&#xff0c;并使用機器學習模型進行預測和回測。主要涉及以下步驟&#xff1a; 初始化環境與設置&#xff1a; 引入必要的庫&#xff0c;如 ray 用于并行計算&#xff0c;pandas 用于數據處理&#xff0c;tqdm 用于進度條顯示等。設置一…

golang 不用sleep如何實現實現每隔指定時間執行一次for循環?

今天介紹的是在go語言里面不用time.Sleep&#xff0c; 使用for range 定時器管道 來實現按照我們指定的時間間隔來執行for循環, 即&#xff1a; for range ticker.C { } 這樣就實現了for每隔指定時間執行一次&#xff0c;除非管道被關閉&#xff0c;否則for而且會一直柱塞當前線…

淺說線性DP(下)

聲明 最近博主身體不適&#xff0c;更新較慢&#xff0c;請大家體諒體諒 最大上升子序列 【題目描述】 一個數的序列 你的任務&#xff0c;就是對于給定的序列&#xff0c;求出最大上升子序列和。注意&#xff0c;最長的上升子序列的和不一定是最大的&#xff0c;比如序列(1…

03-3.3.1 棧在括號匹配中的應用

&#x1f44b; Hi, I’m Beast Cheng&#x1f440; I’m interested in photography, hiking, landscape…&#x1f331; I’m currently learning python, javascript, kotlin…&#x1f4eb; How to reach me --> 458290771qq.com 喜歡《數據結構》部分筆記的小伙伴可以訂…

echarts的使用

一 echarts的使用 引入 echarts.js 文件 <script src"https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js"></script> 準備一個呈現圖表的盒子 <div class"container"><div class"t_header"><span>端午…

東方博宜1760 - 整理抽屜

題目描述 期末考試即將來臨&#xff0c;小T由于同時肩負了學習、競賽、班團活動等多方面的任務&#xff0c;一直沒有時間好好整理他的課桌抽屜&#xff0c;為了更好地復習&#xff0c;小T首先要把課桌抽屜里的書分類整理好。 小T的抽屜里堆著 N 本書&#xff0c;每本書的封面上…

智能視頻監控平臺LntonCVS視頻融合共享平臺保障露營安全解決方案

在當今社會&#xff0c;都市生活的快節奏和壓力使得越來越多的人渴望逃離城市的喧囂&#xff0c;尋求一種短暫的慢生活體驗。他們向往在壯麗的山河之間或寧靜的鄉村中露營&#xff0c;享受大自然的寧靜與美好。隨著露營活動的普及&#xff0c;露營地的場景也變得更加豐富多樣&a…

使用python繪制核密度估計圖

使用python繪制核密度估計圖 核密度估計圖介紹效果代碼 核密度估計圖介紹 核密度估計&#xff08;Kernel Density Estimation&#xff0c;KDE&#xff09;是一種用于估計數據概率密度函數的非參數方法。與直方圖不同&#xff0c;KDE 可以生成平滑的密度曲線&#xff0c;更好地…

Mybatis使用緩存的配置總結

1.全局變量配置cacheEnabled&#xff1a; ture&#xff08;默認&#xff09;&#xff1a;開啟二級緩存&#xff0c; false&#xff1a;關閉二級緩存&#xff0c;但一級緩存不受影響 2.映射文件中mapper標簽下&#xff1a; 配置有&#xff1a;開啟二級緩存 沒配置有&#x…

LeetCode62不同路徑

題目描述 一個機器人位于一個 m x n 網格的左上角 &#xff08;起始點在下圖中標記為 “Start” &#xff09;。機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角&#xff08;在下圖中標記為 “Finish” &#xff09;。問總共有多少條不同的路徑&#xff1f; …

大模型參加高考,同寫2024年高考作文,及格分(通義千問、Kimi、智譜清言、Gemini Advanced、Claude-3-Sonnet、GPT-4o)

大家好&#xff0c;我是章北海 今天高考&#xff0c;上午的語文結束&#xff0c;市面上又要來一場大模型參考的文章了。 我也湊湊熱鬧&#xff0c;讓通義千問、Kimi、智譜清言一起來寫一下高考作文。 公平起見&#xff0c;不加任何其他prompt&#xff0c;直接把題目甩過去。…

網絡基礎_02

1.ARP協議 地址解析協議&#xff08;Address Resolution Protocol&#xff09; 已知對方的三層ip地址&#xff0c;需要二層mac地址 當一臺設備&#xff08;請求方&#xff09;需要知道某個 IP 地址對應的 MAC 地址時&#xff0c;會使用 ARP封裝一個數據幀。這臺設備的網絡層以…

華為RH2288H V3服務器iBMC的SSL證書續期

本文對華為RH2288H V3服務器iBMC的SSL證書續期&#xff0c;以避名登錄告警提示及主機狀態異常。 一、檢查現網服務器iBMC的SSL證書到期時間 登錄iBMC&#xff0c;點擊配置--SSL證書&#xff0c;如下&#xff1a; 可以看到本服務器SSL證書將于今年7月22日到期。 二、聯系廠家…

【第四節】C/C++數據結構之樹與二叉樹

目錄 一、基本概念與術語 二、樹的ADT 三、二叉樹的定義和術語 四、平衡二叉樹 4.1 解釋 4.2 相關經典操作 4.3 代碼展示 一、基本概念與術語 樹(Tree)是由一個或多個結點組成的有限集合T。其中: 1 有一個特定的結點&#xff0c;稱為該樹的根(root)結點&#xff1b; 2 …

【Linux】進程2——管理概念,進程概念

1.什么是管理&#xff1f; 那在還沒有學習進程之前&#xff0c;就問大家&#xff0c;操作系統是怎么管理進行進程管理的呢&#xff1f; 很簡單&#xff0c;先把進程描述起來&#xff0c;再把進程組織起來&#xff01; 我們拿大學為例子 最典型的管理者——校長最典型的被管理…

來自工業界的知識庫 RAG 服務(三),FinGLM 競賽獲獎項目詳解

背景介紹 前面介紹過工業界的 RAG 服務 QAnything 和 RagFlow 的詳細設計&#xff0c;也介紹過來自學術界的 一些優化手段。 前一陣子剛好看到智譜組織的一個金融大模型比賽 FinGLM&#xff0c;主要做就是 RAG 服務的競賽&#xff0c;深入研究了其中的幾個獲獎作品&#xff…