Hash Table基礎css
哈希表(Hash Table)是經常使用的數據結構,其運用哈希函數(hash function)實現映射,內部使用開放定址、拉鍊法等方式解決哈希衝突,使得讀寫時間複雜度平均爲O(1)。html
HashMap(std::unordered_map)、HashSet(std::unordered_set)的原理與Hash Table同樣,它們的用途普遍、用法靈活,接下來側重於介紹它們的應用。git
相關LeetCode題:github
集合數據結構
若是僅須要判斷元素是否存在於某個集合,咱們能夠使用結構HashSet(std::unordered_set)。例如 LeetCode題目 349. Intersection of Two Arrays:app
// 349. Intersection of Two Arrays vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { unordered_set<int> s1(nums1.begin(),nums1.end()); unordered_set<int> s2(nums2.begin(),nums2.end()); vector<int> res; for(auto& a:s1) if(s2.count(a)) res.push_back(a); return res; }
相關LeetCode題:dom
349. Intersection of Two Arrays 題解函數
720. Longest Word in Dictionary 題解
計數
若是須要對元素進行計數,咱們能夠使用結構HashMap(std::unordered_map),元素如取值範圍固定能夠用Array(std::vector),例如LeetCode題目 217. Contains Duplicate:
// 217. Contains Duplicate bool containsDuplicate(vector<int>& nums) { unordered_map<int,int> m; for(int x:nums) if(m[x]++==1) return true; return false; }
相關LeetCode題:
266. Palindrome Permutation 題解
748. Shortest Completing Word 題解
451. Sort Characters By Frequency 題解
30. Substring with Concatenation of All Words 題解
在滑動窗口算法中常使用HashMap計數,關於滑動窗口算法,詳見:算法與數據結構基礎 - 滑動窗口(Sliding Window)
Key-Val
進一步地,HashMap表示一種Key-Val (或ID-屬性) 關係,這裏Val能夠是計數、下標(index)等等。
相關LeetCode題:
953. Verifying an Alien Dictionary 題解
981. Time Based Key-Value Store 題解
244. Shortest Word Distance II 題解
映射
更通常地,HashMap表示一種映射關係,意義在於O(1)時間複雜度完成由 A->B 的映射。
相關LeetCode題:
535. Encode and Decode TinyURL 題解
HashMap與Prefix sum
利用HashMap和Prefix sum,咱們能夠在O(n)時間複雜度求解一類子序列求和問題,其中HashMap用於計數,例如LeetCode題目 560. Subarray Sum Equals K:
// 560. Subarray Sum Equals K int subarraySum(vector<int>& nums, int k) { unordered_map<int,int> m; m[0]=1; int sum=0,res=0; for(auto& a:nums){ sum+=a; res+=m[sum-k]; m[sum]++; } return res; }
相關LeetCode題:
930. Binary Subarrays With Sum 題解
325. Maximum Size Subarray Sum Equals k 題解
HashMap與圖形問題
HashMap能夠應用於二維圖形的一些問題求解,以歐拉距離、斜率、x/y座標等爲key,以計數、x/y座標爲val。圖形問題中HashMap的映射關係不是那麼直觀和明顯,須要單獨計算key、仔細甄別映射關係。
相關LeetCode題:
939. Minimum Area Rectangle 題解
HashMap與vector/list/stack結合
HashMap與vector、list、stack等數據結構能夠結合成爲複合數據結構,這樣能夠既用到HashMap O(1)的優勢,也用到vector支持下標操做、list增刪節點快、stack先進後出的特色。例如 LeetCode題目 380. Insert Delete GetRandom O(1):
// 380. Insert Delete GetRandom O(1) vector<int> v; unordered_map<int,int> m;
以上用vector存儲元素,unordered_map存儲元素和對應下標;getRandom函數利用vector下標操做,而刪除元素時,使用unordered_map取得被刪元素、將vector末尾元素與其對調,利用了HashMap O(1)的優勢。
相關LeetCode題:
380. Insert Delete GetRandom O(1) 題解
895. Maximum Frequency Stack 題解
原文出處:https://www.cnblogs.com/bangerlee/p/11284422.html