リンク
https://leetcode-cn.com/problems/design-hashset/
時間がかかる
問題解決:11分
問題解決:10分
題名
組み込みのハッシュテーブルライブラリを使用せずにハッシュセット(HashSet)を設計します。
MyHashSetクラスを実装します。
- void add(key)値キーをハッシュコレクションに挿入します。
- bool contains(key)この値キーがハッシュセットに存在するかどうかを返します。
- void remove(key)指定された値キーをハッシュセットから削除します。ハッシュセットにそのような値がない場合、何も行われません。
促す:
- 0 <=キー<= 1 0 6 10 ^ 61 06
- 1 0 4 10 ^ 4まで呼び出す1 04追加、削除、および含む。
アイデア
線形ハッシュが使用されます。最大キーは10 6 10 ^ 6であることがわかっているためです。1 06なので、衝突を解決する必要はありません。10610 ^ 6を開くだけです。1 06の配列では、すべての配列がfalseに初期化され、add()は配列添え字の位置をキーとしてtrueに設定し、remove()はfalseに設定し、contains()はこの位置の値を直接返します。
時間計算量:追加、削除、および含まれるものはすべてO(1)O(1)O (1 )
ACコード
class MyHashSet {
private:
vector<bool> hash_set;
public:
/** Initialize your data structure here. */
MyHashSet() {
hash_set.resize(1000100, false);
}
void add(int key) {
hash_set[key] = true;
}
void remove(int key) {
hash_set[key] = false;
}
/** Returns true if this set contains the specified element */
bool contains(int key) {
return hash_set[key];
}
};
/**
* Your MyHashSet object will be instantiated and called as such:
* MyHashSet* obj = new MyHashSet();
* obj->add(key);
* obj->remove(key);
* bool param_3 = obj->contains(key);
*/