1.拉鍊法
int h[n]
, e[n]
, ne[n]
, idx;
// 向雜湊表中插入乙個數
void
insert
(int x)
// 在雜湊表中查詢某個數是否存在
bool
find
(int x)
開放定址法int h[n]
;// 如果x在雜湊表中,返回x的下標;如果x不在雜湊表中,返回x應該插入的位置
intfind
(int x)
return t;
}
模板題1acwing840. 模擬雜湊表
#include
using
namespace std;
const
int n =
200003
;const
intnull
=0x7f7f7f7f
;int h[n]
;int
find
(int x)
return k;
}int
main()
elseif(
*op ==
'q')
}}
模板題2leetcode706. 設計雜湊對映
class
myhashmap
myhashmap()
/** value will always be non-negative. */
void
put(
int key,
intvalue))
;else it-
>second =
value;}
intget
(int key)
void
remove
(int key)};
/** * your myhashmap object will be instantiated and called as such:
* myhashmap* obj = new myhashmap();
* obj->put(key,value);
* int param_2 = obj->get(key);
* obj->remove(key);
*/
解法一:用先序遍歷將二叉樹線索化,則每一棵子樹對應乙個字串,用hash來記錄每條字串的個數。由於線索化字串的長度是o(n)的,一共n個節點,做n次操作時間複雜度就成o(n^2)的了。class
solution
vector>
findduplicatesubtrees
(treenode* root)
};
解法二:在解法一的基礎上可考慮將每乙個字串對映成乙個數字,則一棵子樹的字串長度即變成o(1)級的,包括頭節點,左邊字串對應的數字,右邊字串對應的數字。時間複雜度降為o(n)級。class
solution
vector>
findduplicatesubtrees
(treenode* root)
};
思路:使用sum儲存字首和s[i]。mp[sum-k]表示sum-k這一字首和出現的次數。此時字首和為sum,sum - (sum - k)即為k,存在mp[sum-k]個子陣列和為k。class
solution
return ans;}}
;
1 雜湊表(雜湊表)的定義
一般的查詢 給你乙個順序表,你會如何查詢某個給定的元素?到了有序表 已排序的表 查詢時,我們可以利用a i 與key的 或 來折半查詢,直到相等時查詢成功返回i。反正我們的目標就是要找到那個 i 值,是不是還有其它好點的方法呢?乙個小故事 試想這樣的場景,你很想學太極拳,聽說學校有個叫張三丰的人打得...
資料結構 雜湊表1(雜湊表)
雜湊表 雜湊表是一種資料結構,它提供了快速的插入操作和查詢操作,其基於陣列來實現。雜湊化方式 1 直接將關鍵字作為索引。弊端 關鍵字資料型別只能是整形。2 將單詞轉換成索引。將字母轉換成ascii碼,然後進行相加。弊端 會出現不同的字串轉換ascii碼的值和相同。冪的連乘。弊端 通過冪的連乘得到的k...
dfs 回溯習題整理(1)
搜尋順序 按照給出的數字依次進行搜尋,對於每乙個數字列舉它選用每乙個字母的方案。回溯 當下乙個字串已經列舉完成時,需要更新當前字串,此時需要進行回溯。然後進行列舉,到當前字串的下乙個元素。第一次寫時,迴圈的意義沒有考慮清楚,這個做法的迴圈是列舉當前字串的每個字元,而不是下乙個字串的每個字元。clas...