美文网首页Leetcode
Leetcode.380.Insert Delete GetRa

Leetcode.380.Insert Delete GetRa

作者: Jimmy木 | 来源:发表于2020-01-04 11:08 被阅读0次

    题目

    设计一个数据结构,实现插入,删除,取随机值,要求时间复杂度为O(1).

    思路

    插入和删除使用map,主要是取随机值,最好是有一个数组记录map的索引,但是数组的删除比较慢,只能删除最后一个,所以在删除时进行内容交换.

    class RandomizedSet {
    private:
        unordered_map<int,int> m_map;
        vector<int> m_vec;
    public:
        /** Initialize your data structure here. */
        RandomizedSet() {
            srand((unsigned)time(NULL));
        }
    
        /** Inserts a value to the set. Returns true if the set did not already contain the specified element. */
        bool insert(int val) {
            if (m_map.count(val) > 0) {
                return false;
            }
            m_vec.push_back(val);
            m_map[val] = (int)m_vec.size()-1;
            return true;
        }
    
        /** Removes a value from the set. Returns true if the set contained the specified element. */
        bool remove(int val) {
            if (m_map.count(val) == 0) {
                return false;
            }
            int index = m_map[val];
            int last = (int)m_vec.size()-1;
            int temp = m_vec[m_vec.size()-1];
            m_vec[last] = m_vec[index];
            m_vec[index] = temp;
            m_map[temp] = index;
            m_map[val] = last;
            m_vec.pop_back();
            m_map.erase(val);
            return true;
        }
    
        /** Get a random element from the set. */
        int getRandom() {
            int res = (rand() % (m_vec.size()));
            return m_vec[res];
        }
    };
    

    总结

    灵活运算数组, 数组虽然插入删除比较慢,但是可以通过交换数组内容来快速删除插入.

    还可以使用set,或者将map转换为数组来取随机值,但是效率太低.

    相关文章

      网友评论

        本文标题:Leetcode.380.Insert Delete GetRa

        本文链接:https://www.haomeiwen.com/subject/xvuxactx.html