码迷,mamicode.com
首页 > 其他好文 > 详细

Insert Delete GetRandom

时间:2017-08-19 00:51:45      阅读:202      评论:0      收藏:0      [点我收藏+]

标签: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) 内生成随机数.

Insert Delete GetRandom

标签:follow   empty   还需要   abi   span   oms   hash表   val   rom   

原文地址:http://www.cnblogs.com/apanda009/p/7392576.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!