重拾C++之菜鳥刷算法第4篇---哈希表

一些理論知識

哈希函數是一種映射關系,根據關鍵詞key,經過一定函數關系得到元素的位置。

常見的哈希函數構造方法

  • 直接定址法

  • 除留余數法

  • 疊加法

  • 隨機數法

哈希沖突

不同關鍵字通過相同哈希函數計算出相同的哈希地址,該種現象稱為哈希沖突或者哈希碰撞

--------

熟練掌握幾種常見的STL。

一、有效的字母異位詞

知識點

  • 統計字母個數操作技巧 record[s[i] - 'a']++;

  • 數組也是哈希表哦~

題目

給定兩個字符串 *s**t* ,編寫一個函數來判斷 *t* 是否是 *s* 的字母異位詞。

注意:*s**t* 中每個字符出現的次數都相同,則稱 *s**t* 互為字母異位詞。

242. 有效的字母異位詞 - 力扣(LeetCode)

題解

class Solution {
public:bool isAnagram(string s, string t) {vector<int> record(26, 0);// 統計s中字母個數for(int i = 0; i < s.size(); i++){record[s[i] - 'a']++;}for(int j = 0; j < t.size(); j++){record[t[j] - 'a']--;}for(int k = 0; k < record.size(); k++){if(record[k] != 0){return false;}}return true;}
};

二、兩個數組的交集

知識點

  • unordered_set 無序集合;存儲唯一元素;與 set 不同,unordered_set 不會對元素進行排序,而是使用哈希表來實現快速的查找和插入操作。 unordered_set 使用哈希表來實現,這使得查找、插入和刪除操作的平均時間復雜度為常數級別(O(1))。

  • find 如果找到了,find 返回指向該元素的迭代器,否則返回 nums1_set.end(),表示未找到。

題目

給定兩個數組 nums1nums2 ,返回 它們的交集 。輸出結果中的每個元素一定是 唯一 的。我們可以 不考慮輸出結果的順序

349. 兩個數組的交集 - 力扣(LeetCode)

題解

class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {unordered_set<int> result_set;unordered_set<int> nums1_set(nums1.begin(), nums1.end());
?for (int i = 0; i < nums2.size(); i++){if(nums1_set.find(nums2[i]) != nums1_set.end()){result_set.insert(nums2[i]);}}
?return vector<int> (result_set.begin(), result_set.end());}
};

三、快樂數

知識點

  • 停止條件的設置

在計算每個位置上的數字的平方和時,如果出現了之前已經計算過的結果,就會形成一個循環。這是因為每個數字的平方和可能會有限個,而如果在計算的過程中遇到了之前的結果,就會陷入一個循環,不斷重復。

題目

編寫一個算法來判斷一個數 n 是不是快樂數。

「快樂數」 定義為:

  • 對于一個正整數,每一次將該數替換為它每個位置上的數字的平方和。

  • 然后重復這個過程直到這個數變為 1,也可能是 無限循環 但始終變不到 1。

  • 如果這個過程 結果為 1,那么這個數就是快樂數。

如果 n快樂數 就返回 true ;不是,則返回 false

202. 快樂數 - 力扣(LeetCode)

題解

class Solution {
public:int get_sum(int n){int sum = 0;while(n){sum += (n % 10) * (n % 10);n /= 10;}return sum;}
?bool isHappy(int n) {unordered_set<int> result_sum;while(1){int sum = get_sum(n);if(sum == 1) return true;if(result_sum.find(sum) == result_sum.end()){result_sum.insert(sum);}else{return false;}n = sum;}}
};

四、兩數之和

知識點

學會 unordered_map 的用法

映射底層實現是否有序數值是否可以重復能否更改數值查詢效率增刪效率
std::map紅黑樹key有序key不可重復key不可修改O(log n)O(log n)
std::multimap紅黑樹key有序key可重復key不可修改O(log n)O(log n)
std::unordered_map哈希表key無序key不可重復key不可修改O(1)O(1)

題目

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

你可以假設每種輸入只會對應一個答案。但是,數組中同一個元素在答案里不能重復出現。

你可以按任意順序返回答案。

1. 兩數之和 - 力扣(LeetCode)

題解

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map <int, int> nums_map;for(int i = 0; i < nums.size(); i++){int tmp = target - nums[i];auto goal = nums_map.find(tmp);if(goal != nums_map.end()){return {goal->second, i};}nums_map.insert(pair<int,int>(nums[i], i));}return {};}
};

五、四數相加 II

知識點

  • 時間復雜度; 不需要考慮去重;哈希表

題目

給你四個整數數組 nums1nums2nums3nums4 ,數組長度都是 n ,請你計算有多少個元組 (i, j, k, l) 能滿足:

  • 0 <= i, j, k, l < n

  • nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0

454. 四數相加 II - 力扣(LeetCode)

題解

class Solution {
public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {unordered_map<int,int> Map;
?for (int i : nums1){for(int j : nums2){Map[i + j]++; }}
?int count = 0;for (int i : nums3){for(int j : nums4){if(Map.find(-(i + j)) != Map.end()){count += Map[-(i + j)];}}}return count;}
};

六、贖金信

題目

給你兩個字符串:ransomNotemagazine ,判斷 ransomNote 能不能由 magazine 里面的字符構成。

如果可以,返回 true ;否則返回 false

magazine 中的每個字符只能在 ransomNote 中使用一次。

383. 贖金信 - 力扣(LeetCode)

題解

解法類似于 ‘有效的字母異位詞’

class Solution {
public:bool canConstruct(string ransomNote, string magazine) {int record[26] = {0};for(int i = 0; i < magazine.size(); i++){record[magazine[i] - 'a']++;}
?for(int j = 0; j < ransomNote.size(); j++){record[ransomNote[j] - 'a']--;}
?for(int k = 0; k < 26; k++){if(record[k] < 0){return false;}}return true;}
};

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

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

相關文章

視頻匯聚/存儲/壓縮/診斷平臺EasyCVR視頻聯網整合方案應用特點

隨著科技的不斷發展&#xff0c;監控視頻在各個領域的應用越來越廣泛。為了更好地管理和利用這些視頻資源&#xff0c;視頻聯網與整合的需求也越來越多。通過視頻聯網技術將不同地理位置或不同設備的視頻資源進行整合&#xff0c;實現實時共享和集中管理。視頻聯網整合方案的應…

6、云原生安全之falco的規則解讀(部分)(下)

文章目錄 3、規則解析記錄3.21、檢測是否有非特權用戶成功執行userfaultfd系統調用3.22、監控容器內通過curl/wget的下載行為3.23、檢測容器內修改release_agent文件的場景(無論修改成功與否)3.24、檢測Java進程通過網絡加載class類文件的行為,該規則用于檢測log4j的應急3.2…

Linux運維_Bash腳本_編譯安裝GNU-Tools

Linux運維_Bash腳本_編譯安裝GNU-Tools Bash (Bourne Again Shell) 是一個解釋器&#xff0c;負責處理 Unix 系統命令行上的命令。它是由 Brian Fox 編寫的免費軟件&#xff0c;并于 1989 年發布的免費軟件&#xff0c;作為 Sh (Bourne Shell) 的替代品。 您可以在 Linux 和 …

2024最新算法:鸚鵡優化算法(Parrot optimizer,PO)求解23個基準函數

一、鸚鵡優化算法 鸚鵡優化算法&#xff08;Parrot optimizer&#xff0c;PO&#xff09;由Junbo Lian等人于2024年提出的一種高效的元啟發式算法&#xff0c;該算法從馴養的鸚鵡中觀察到的覓食、停留、交流和對陌生人行為的恐懼中汲取靈感。這些行為被封裝在四個不同的公式中…

C++_紅黑樹

目錄 1、紅黑樹的規則 2、紅黑樹節點的定義 3、紅黑樹插入節點的調整操作 3.1 情況一 3.2 情況二 3.3 情況三 4、紅黑樹的實現 結語 前言&#xff1a; 在C中&#xff0c;紅黑樹是二叉搜索樹的另一種優化版本&#xff0c;他與AVL樹的區別在于保持樹的平衡方式不同&…

【Mysql】Navicat數據庫勿刪了mysql.infoschema@localhost,導致打不開數據庫,如何修改

運行報錯如下&#xff1a; 1449 . The user specified as a definer (mysql.infoschemaocalhost) does not exist該方法不需要重啟mysql&#xff0c;或者重裝&#xff1b;僅需要恢復刪除的mysql.infoschemalocalhost用戶 一、登錄建立用戶 mysql -uroot -pxxxxxx密碼二、建立…

【網上商城系統的設計與開發】

目錄 1.實訓概況 1 1.1 實訓題目 1 1.2實訓時間 1 1.3實訓目的 1 1.4 實訓環境 1 1.5 實訓內容 2 1.6 進度安排 3 2.需求分析 5 2.1 功能需求分析 5 2.1.1用戶需求分析 5 2.2.2網站前臺需求 5 2.2.3網站后臺需求 6 2.2 可行性分析 7 2.2.1社會可行性 7 2.2.2技術可行性 8 3.系統…

Sora學習(一):Sora技術路徑整體認知

前文&#xff1a;最近跟著DataWhale組隊學習這一期“Sora原理與技術實戰”&#xff0c;本篇博客主要是基于DataWhale成員、廈門大學平潭研究院楊知錚研究員分享的Sora技術原理詳解課件內容以及參考網上一些博客資料整理而來&#xff08;詳見文末參考文獻&#xff09;&#xff0…

【談一談】并發編程_鎖的分類

【談一談】并發編程_鎖的分類 Hello!~大家好!~每天進步一點點,日復一日,我們終將問劍頂峰 這里主要是介紹下我們常用的鎖可以分為幾類,目的是整體框架作用~方便后續的并發文章 說白了,這篇就是開頭哈~ 本文總綱: 一.可重入鎖和不可重入鎖 我們開發中一般用到的都是可重入鎖比如…

Photoshop 2023:重塑創意,引領數字藝術新紀元

在數字藝術的浩瀚星空中&#xff0c;Adobe Photoshop 2023&#xff08;簡稱PS 2023&#xff09;如同一顆璀璨的新星&#xff0c;為Mac和Windows用戶帶來了前所未有的創意體驗。這款強大的圖像處理軟件不僅繼承了前作的精髓&#xff0c;更在細節上進行了諸多創新&#xff0c;讓每…

運行Python文件時出現‘utf-8’code can‘t decode byte 如何解決?(如圖)

如圖 亦或者出現“SyntaxError: Non-UTF-8 code starting with \xbb ” 出現這種問題往往是編碼格式導致的&#xff0c;我們可以在py文件中的第一行加入以下代碼&#xff1a; # codingutf-8或者 # codinggdk優先使用gbk編碼 解釋一下常用的兩種編碼格式&#xff1a; utf-…

朱維群將出席用碳不排碳碳中和頂層科技路線設計開發

演講嘉賓&#xff1a;朱維群 演講題目&#xff1a;“用碳不排碳”碳中和頂層科技路線設計開發 簡介 姓名&#xff1a;朱維群 性別&#xff1a;男 出生日期&#xff1a;1961-09-09 職稱&#xff1a;教授 1998年畢業于大連理工大學精細化工國家重點實驗室精細化工專業&…

什么是B+樹,和B樹有什么不同?

&#x1f449;博主介紹&#xff1a; 博主從事應用安全和大數據領域&#xff0c;有8年研發經驗&#xff0c;5年面試官經驗&#xff0c;Java技術專家&#xff0c;WEB架構師&#xff0c;阿里云專家博主&#xff0c;華為云云享專家&#xff0c;51CTO 專家博主 ?? 個人社區&#x…

Spring Initializer環境問題

1.基于jdk8與本地 環境準備 1)下載jdk8并安裝 2&#xff09;下載maven 3.6.3并解壓放入D盤maven目錄下&#xff0c;去掉外層 設置阿里源 打開settings.xml,在mirrors標簽之內增加&#xff0c;注意粘貼后</id>中的/有可能被刪掉&#xff0c;要自己補上 <mirror>&l…

健身房預約小程序制作詳細步驟解析

如果你是一位健身愛好者&#xff0c;或者是一位健身教練&#xff0c;你一定知道預約健身的痛苦。傳統的預約方式不僅麻煩&#xff0c;而且效率低下。但是&#xff0c;現在&#xff0c;我們可以使用一種神仙工具——喬拓云網&#xff0c;來搭建一個屬于自己的健身預約小程序&…

【VTKExamples::PolyData】第四十三期 PolyDataPointSampler

很高興在雪易的CSDN遇見你 VTK技術愛好者 QQ:870202403 前言 本文分享VTK樣例PolyDataPointSampler,并解析接口vtkPolyDataPointSampler,希望對各位小伙伴有所幫助! 感謝各位小伙伴的點贊+關注,小易會繼續努力分享,一起進步! 你的點贊就是我的動力(^U^)ノ~YO …

如何使用 CrewAI 構建協作型 AI Agents

一、前言 AI Agents 的開發是當前軟件創新領域的熱點。隨著大語言模型 (LLM) 的不斷進步&#xff0c;預計 AI 智能體與現有軟件系統的融合將出現爆發式增長。借助 AI 智能體&#xff0c;我們可以通過一些簡單的語音或手勢命令&#xff0c;就能完成以往需要手動操作應用程序才能…

運維的利器–監控–zabbix–grafana

運維的利器–監控–zabbix–grafana 一、介紹 Grafana 是一個跨平臺的開源的度量分析和可視化工具 , 可以通過將采集的數據查詢然后可視化的展示 。zabbix可以作為數據源&#xff0c;為grafana提供數據&#xff0c;然后grafana將數據以圖表或者其他形式展示出來。zabbix和gra…

基于YOLOv的目標追蹤與無人機前端查看系統開發

一、背景與簡介 隨著無人機技術的快速發展&#xff0c;目標追蹤成為無人機應用中的重要功能之一。YOLOv作為一種高效的目標檢測算法&#xff0c;同樣適用于目標追蹤任務。通過集成YOLOv模型&#xff0c;我們可以構建一個無人機前端查看系統&#xff0c;實現實時目標追蹤和可視化…

零基礎學編程,中文編程工具之進度標尺構件的編程用法

零基礎學編程&#xff0c;中文編程工具之進度標尺構件的編程用法 一、前言 今天給大家分享的中文編程開發語言工具 進度條構件的用法。 編程入門視頻教程鏈接 https://edu.csdn.net/course/detail/39036 編程工具及實例源碼文件下載可以點擊最下方官網卡片——軟件下載——…