zoukankan      html  css  js  c++  java
  • Leetcode每日一题 705. 设计哈希集合

    不使用任何内建的哈希表库设计一个哈希集合(HashSet)。

    实现 MyHashSet 类:

    void add(key) 向哈希集合中插入值 key 。
    bool contains(key) 返回哈希集合中是否存在这个值 key 。
    void remove(key) 将给定值 key 从哈希集合中删除。如果哈希集合中没有这个值,什么也不做。
     
    示例:

    输入:

    ["MyHashSet", "add", "add", "contains", "contains", "add", "contains", "remove", "contains"]
    [[], [1], [2], [1], [3], [2], [2], [2], [2]]

    输出:

    [null, null, null, true, false, null, true, null, false]

    解释:

    MyHashSet myHashSet = new MyHashSet();
    myHashSet.add(1); // set = [1]
    myHashSet.add(2); // set = [1, 2]
    myHashSet.contains(1); // 返回 True
    myHashSet.contains(3); // 返回 False ,(未找到)
    myHashSet.add(2); // set = [1, 2]
    myHashSet.contains(2); // 返回 True
    myHashSet.remove(2); // set = [1]
    myHashSet.contains(2); // 返回 False ,(已移除)

    提示:

    0 <= key <= 106
    最多调用 104 次 add、remove 和 contains 。

    class MyHashSet {
    public:
        /** Initialize your data structure here. */
        int index;
        vector<int> v;
        MyHashSet() {
            index = -1;
        }
        
        void add(int key) {
            if(!contains(key))
            {
                v.insert(v.begin()+index,key);
            }
        }
        
        void remove(int key) {
            if(contains(key))
            {
                v.erase(v.begin()+index);
            }
        }
        
        /** Returns true if this set contains the specified element */
        bool contains(int key) {
            int v_size = v.size();
            int left = 0;
            int right = v_size - 1;
            int mid = left + (right-left)/2;
            while(left <= right)
            {
                mid = left + (right-left)/2;
                if(v[mid]==key)
                {
                    index = mid;
                    return true;
                }
                else if(v[mid] > key)
                {
                    right = mid - 1;
                }
                else if(v[mid] < key)
                {
                    left = mid + 1;
                }
            }
            index = right + 1;
            return false;
        }
    };
    
    /**
     * 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);
     */

    懒得想扩容问题,就用个vector数组,然后加上二分法查找,维护一个递增的哈希集合。

  • 相关阅读:
    bzoj 3308 九月的咖啡店
    8.13模拟赛
    8.10模拟赛
    8.9模拟赛
    8.8模拟赛
    Codeforces Round #406 (Div. 2) D. Legacy (线段树建图dij)
    BZOJ 2957: 楼房重建 (分块)
    SPOJ BGSHOOT
    Codeforces Round #404 (Div. 2) E. Anton and Permutation(树状数组套主席树 求出指定数的排名)
    Lightoj-1356 Prime Independence(质因子分解)(Hopcroft-Karp优化的最大匹配)
  • 原文地址:https://www.cnblogs.com/xiangqi/p/14528475.html
Copyright © 2011-2022 走看看