380. Insert Delete GetRandom O(1)
经过昨天的消沉

今天我振作了

设计个数据结构,添加,删除,随机获取都是O(1).
怎么会有这么牛逼的数据结构,所以肯定相应的要耗费空间。
添加和获取耗时O(1)是Array的特性,或者说是Map/Table的特性,思考下php的array就明白其实是index的mapping了。
Random要求O(1)那就是需要知道数据结构的大小,并且保证储存的元素是相邻的。
其实就是一个table/map,KEY是添加的元素,value是他储存在array中的位置;
然后一个array和上面的table/map对应;
再一个变量size记录总共有多少个元素,便于random.
添加,直接添加到SIZE的位置,MAP里记录,SIZE++
RANDOM,通过SIZE随便RANDOM一个数,直接从ARRAY里直接获取。
删除,为了保证所有元素在ARRAY中是相邻的,像LIST那样。用ARRAY模拟就是删除之后,后面所有的都前移,但是要求O(1),可以把最后一个元素和它换一下。换的时候相应的改变MAP/TABLE里的信息,删除map里本来最后一个KEY(因为我们换到前面了),最后SIZE--,使得array[size]指向的位置虽然不为空,但是是标记为删除的元素,就是刚才换过来的,而RANDOM不会影响。
感觉和学习哦啊以前做过的用JAVA实现PHP ARRAY的作业有点像,只不过那个要自己写hash function
为了图省事不resize array,用了arrayList,但是意思是那个意思。。
public class RandomizedSet {
Map<Integer,Integer> map;
List<Integer> list;
int size;
/** Initialize your data structure here. */
public RandomizedSet()
{
map = new HashMap<Integer,Integer>();
list = new ArrayList<Integer>();
this.size = 0;
}
/** Inserts a value to the set. Returns true if the set did not already contain the specified element. */
public boolean insert(int val)
{
if(map.containsKey(val)) return false;
else
{
list.add(size,val);
map.put(val,size++);
return true;
}
}
/** Removes a value from the set. Returns true if the set contained the specified element. */
public boolean remove(int val)
{
if(!map.containsKey(val)) return false;
else if(size == 0) map.remove(val);
else
{
int tailKey = list.get(size-1);
map.put(tailKey,map.get(val));
list.set(map.get(val),tailKey);
size--;
map.remove(val);
}
return true;
}
/** Get a random element from the set. */
public int getRandom()
{
Random rdm = new Random();
return list.get(rdm.nextInt(size));
}
}
二刷。
用个Map,KEY是存的元素,VAL是元素存在arraylist里的位置。
删除是把arraylist里最后一个有效元素和删除的元素调换,同时修改map里被最后一个有效元素(key)的相应位置(value)。。
public class RandomizedSet {
List<Integer> list;
int num;
Map<Integer, Integer> map;
/** Initialize your data structure here. */
public RandomizedSet() {
list = new ArrayList<>();
num = 0;
map = new HashMap<>();
}
/** Inserts a value to the set. Returns true if the set did not already contain the specified element. */
public boolean insert(int val) {
if (map.containsKey(val)) {
return false;
} else {
list.add(num, val);
map.put(val, num++);
return true;
}
}
/** Removes a value from the set. Returns true if the set contained the specified element. */
public boolean remove(int val) {
if (!map.containsKey(val)) {
return false;
} else if (num == 0) {
map.remove(val);
return true;
} else {
int removedIndex = map.get(val);
int backElement = list.get(num - 1);
map.put(backElement, removedIndex);
list.set(removedIndex, backElement);
num--;
map.remove(val);
return true;
}
}
/** Get a random element from the set. */
public int getRandom() {
Random rdm = new Random();
return list.get(rdm.nextInt(num));
}
}
380. Insert Delete GetRandom O(1)的更多相关文章
- LeetCode 380. Insert Delete GetRandom O(1)
380. Insert Delete GetRandom O(1) Add to List Description Submission Solutions Total Accepted: 21771 ...
- leetcode 380. Insert Delete GetRandom O(1) 、381. Insert Delete GetRandom O(1) - Duplicates allowed
380. Insert Delete GetRandom O(1) 实现插入.删除.获得随机数功能,且时间复杂度都在O(1).实际上在插入.删除两个功能中都包含了查找功能,当然查找也必须是O(1). ...
- 【LeetCode】380. Insert Delete GetRandom O(1) 解题报告(Python)
[LeetCode]380. Insert Delete GetRandom O(1) 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxu ...
- [LeetCode] 380. Insert Delete GetRandom O(1) 常数时间内插入删除和获得随机数
Design a data structure that supports all following operations in average O(1) time. insert(val): In ...
- [LeetCode] 380. Insert Delete GetRandom O(1) 插入删除获得随机数O(1)时间
Design a data structure that supports all following operations in average O(1) time. insert(val): In ...
- [leetcode]380. Insert Delete GetRandom O(1)常数时间插入删除取随机值
Design a data structure that supports all following operations in average O(1) time. insert(val): In ...
- LeetCode 380. Insert Delete GetRandom O(1) (插入删除和获得随机数 常数时间)
Design a data structure that supports all following operations in average O(1) time. insert(val): In ...
- 380. Insert Delete GetRandom O(1) 设计数据结构:在1的时间内插入、删除、产生随机数
[抄题]: Design a data structure that supports all following operations in average O(1) time. insert(va ...
- LeetCode 380. Insert Delete GetRandom O(1) 常数时间插入、删除和获取随机元素(C++/Java)
题目: Design a data structure that supports all following operations in averageO(1) time. insert(val): ...
- [LC] 380. Insert Delete GetRandom O(1)
Design a data structure that supports all following operations in average O(1) time. insert(val): In ...
随机推荐
- JS分段上传文件(File)并使用MD5.js加密文件段用来后台校验
HTML <form method="POST" name="form1" action="/mupload/upload/" enc ...
- 转换rgb为16进制颜色值
function rgb2hex(rgb) { rgb = rgb.match(/^rgb\((\d+),(\d+),(\d+)\)$/); function hex(x) { return (&qu ...
- 又一家自适应学习平台上线,大讲台主攻IT在线教育
自适应学习技术自2015年以内,越来越受到在线教育公司的关注和重视,极客学院创始人靳岩7月初在接受媒体采访时曾提到,百万用户只是极客学院的第一步,下一步的目标是自适应学习.靳岩认为,自适应学习代表未来 ...
- Ubuntu下Memcache的安装与基本使用
安装Memcache Memcache分为两部分,Memcache服务端和客户端.Memcache服务端是作为服务来运行的,所有数据缓存的建立,存储,删除实际上都是在这里完成的.客户端,在这里我们指的 ...
- contos vsftp 530错误
只需要把/etc/pam.d/vsftpd文件中的 auth required pam_listfile.so item=user sense=deny file=/etc/vsft ...
- windows appfabric samples
http://www.microsoft.com/en-us/download/details.aspx?id=19603 http://msdn.microsoft.com/zh-cn/librar ...
- Java中double类型的数据精确到小数点后两位
Java中double类型的数据精确到小数点后两位 多余位四舍五入,四种方法 一: double f = 111231.5585;BigDecimal b = new BigDecimal(f); d ...
- 关于keil中data,idata,xdata,pdata,code的问题
转自关于keil中data,idata,xdata,pdata,code的问题 从数据存储类型来说,8051系列有片内.片外程序存储器,片内.片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类 ...
- Python脚本调用C#代码数据交互示例(hello world)
原地址: http://www.djangochina.cn/forum.php?mod=viewthread&tid=247 随着项目的逐渐收尾, 对IronPython脚本也越来越熟悉,这 ...
- Oracle的常见错误及解决办法
ORA-12528: TNS:listener: all appropriate instances are blocking new connections ORA-12528问题是因为监听中的服务 ...