标签:follow empty 还需要 abi span oms hash表 val rom
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();
如果这道题没有常数时间的限制,那么将会是一道非常简单的题,我们直接用一个set就可以搞定所有的操作。但是由于时间的限制,我们无法在常数时间内实现获取随机数,所以只能另辟蹊径。
要返回随机数对于数组来说就很简单了,我们只要随机生成一个位置,返回该位置上的数字即可,但是要删除也是O(1)的, 我们还需要用hashmap 来建立每个数字和其在数组中的位置之间的映射,然后将要删除的数字和数组的最后一个数字调换个位置,然后修改对应的哈希表中的值,这样我们只需要删除数组的最后一个元素即可,保证了常数时间内的删除。
如果只用链表和hash表的话没法O(1) 内生成随机数.
标签:follow empty 还需要 abi span oms hash表 val rom
原文地址:http://www.cnblogs.com/apanda009/p/7392576.html