p145 支持随机获取元素的集合(leetcode 380)

Posted repinkply

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了p145 支持随机获取元素的集合(leetcode 380)相关的知识,希望对你有一定的参考价值。

一:解题思路

二:完整代码示例 (C++版和Java版)

C++:

class RandomizedSet 
{
private:
    map<int, int> m_map;
    vector<int> m_data;
public:
    /** Initialize your data structure here. */
    RandomizedSet() {

    }

    /** 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_data.push_back(val);
        m_map[val] = m_data.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 idx = m_map[val];
        int lastVal = m_data[m_data.size()-1];
        m_data[idx] = lastVal;
        m_data.pop_back();
        m_map[lastVal] = idx;
        m_map.erase(val);

        return true;
    }

    /** Get a random element from the set. */
    int getRandom() 
    {
        int idx = rand() % (m_data.size());

        return m_data[idx];
    }
};

Java:

class RandomizedSet
    {
        private Map<Integer,Integer> m_map=new HashMap<>();
        private List<Integer> m_data=new ArrayList<>();
        private Random RANDOM=new Random();
        /** Initialize your data structure here. */
        public RandomizedSet() {

        }

        /** Inserts a value to the set. Returns true if the set did not already contain the specified element. */
        public boolean insert(int val)
        {
               if(m_map.containsKey(val)) return false;
               m_data.add(val);
               m_map.put(val,m_data.size()-1);
               return true;
        }

        /** Removes a value from the set. Returns true if the set contained the specified element. */
        public boolean remove(int val)
        {
               if(!m_map.containsKey(val)) return false;
               int idx=m_map.get(val);
               int lastVal=m_data.get(m_data.size()-1);
               m_data.set(idx,lastVal);
               m_data.remove(m_data.size()-1);
               m_map.put(lastVal,idx);
               m_map.remove(val);
               
               return true;
        }

        /** Get a random element from the set. */
        public int getRandom() 
        {
               int idx=RANDOM.nextInt(m_data.size());
               
               return m_data.get(idx);
        }
    }

 

以上是关于p145 支持随机获取元素的集合(leetcode 380)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 0381. O 时间插入删除和获取随机元素 - 允许重复

LeetCode 0381. O 时间插入删除和获取随机元素 - 允许重复

LeetCode - 随机集合最长的多类别子序列

380. O 时间插入删除和获取随机元素

常数时间插入删除和获取随机元素

算法刷题-O 时间插入删除和获取随机元素汇总区间