【leetcode】Insert Delete GetRandom O(1)
2016-08-05 15:28
501 查看
Insert Delete GetRandom O(1)
问题描述
Design a data structure that supports all following operations in average O(1) time.insert(val): Inserts an item val to the set if not already present.
remove(val): Removes an item val from the set if present.
getRandom: Returns a random element from current set of elements. Each element must have the same probability of being returned.
Example:
// Init an empty set. RandomizedSet randomSet = new RandomizedSet(); // Inserts 1 to the set. Returns true as 1 was inserted successfully. randomSet.insert(1); // Returns false as 2 does not exist in the set. randomSet.remove(2); // Inserts 2 to the set, returns true. Set now contains [1,2]. randomSet.insert(2); // getRandom should return either 1 or 2 randomly. randomSet.getRandom(); // Removes 1 from the set, returns true. Set now contains [2]. randomSet.remove(1); // 2 was already in the set, so return false. randomSet.insert(2); // Since 1 is the only number in the set, getRandom always return 1. randomSet.getRandom();
问题分析
题目是需要我们设计一个支持以下操作的数据结构,并且执行时间需要在O(1)时间内:1. insert(val):当val不存在时在集合中插入数据,如果成功插入了,返回true;否则返回false
2. remove(val):当val存在时删除集合中的val,如果成功删除了,返回true;否则返回false
3. 返回集合中的一个随机数据,每一个元素必须有被获取的相同的可能性
既然是O(1),那最合适的用来存储数据的集合就是Hash表了。而同时要求插入数据时如果数据已经存在,就不执行插入操作。
很显然,这个数据在集合(集合的特性之一也是元素互异)中是唯一的,那么我们可以就使用这个数据作为key,然后用一个递增的变量作为value就可以实现了。
当时没想到,使用map实现后才想起原来可以直接用set(集合),所以就用set又实现了一次,不仅通过了,且时间缩短了将近一半!
代码实现
map实现:class RandomizedSet { map<int,int> values; int cur; public: /** Initialize your data structure here. */ RandomizedSet() { cur=0; } /** Inserts a value to the set. Returns true if the set did not already contain the specified element. */ bool insert(int val) { if(values.find(val) != values.end()) { return false; } values[val] = cur; cur++; return true; } /** Removes a value from the set. Returns true if the set contained the specified element. */ bool remove(int val) { if(values.find(val) != values.end()) { map<int, int>::iterator it; map<int, int>::iterator saveIt; for(it=values.begin();it!=values.end();it++) { if(it->first==val) { saveIt = it; break; } } values.erase(it); return true; } return false; } /** Get a random element from the set. */ int getRandom() { int r = rand()% values.size(); map<int, int>::iterator it; int i=0; for(it=values.begin();it!=values.end();it++) { if(i==r) { return it->first; } i++; } return 0; } };
set实现
class RandomizedSet { set<int> values; 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(values.find(val) != values.end()) { return false; } values.insert(values.begin(), val); return true; } /** Removes a value from the set. Returns true if the set contained the specified element. */ bool remove(int val) { if(values.find(val) != values.end()) { values.erase(val); return true; } return false; } /** Get a random element from the set. */ int getRandom() { int r = rand()% values.size(); set<int>::iterator it; int i=0; for(it=values.begin();it!=values.end();it++) { if(i==r) { return *it; } i++; } return 0; } };
转载请注明:原文地址
相关文章推荐
- #ifdef __cplusplus extern "C" { #endif //一段代码 #ifdef __cplusplus } #endif
- SE新手游操控创新:一个按键=五个技能
- ios时间戳13位转换
- 第三方集成的坑如:java.util.zip.ZipException: duplicate entry: com/ta/utdid2/android/utils/AESUtils.class
- C++11 thread_local 关键词
- Hadoop MapReduce 二次排序
- CSS引用方式
- Ubuntu 中github的配置和使用
- 最详细的Log4j使用教程
- get和post区别
- 如何用C语言、Python实现栈及典型应用
- STL实现的底层数据结构简介
- Generating Artifacts问题解决汇总
- Servlet 3.0 新特性详解
- Codeforces Round #365 (Div. 2) 题解
- python单元测试
- 205.leetcode Isomorphic Strings (easy)[map结构 字符串处理]
- 为什么主引导记录的内存地址是0x7C00?
- staticmethod classmethod 创建静态类
- JavaScript prototype