Re: [闲聊] 每日LeetCode

楼主: Rushia (みけねこ的鼻屎)   2022-11-29 10:42:08
380. Insert Delete GetRandom O(1)
设计一个Set资料结构,支援以下操作:
insert(int val):若元素不存在插入元素并返回true,否则false。
remove(int val):若元素存在则移除元素并返回true,否则false。
getRandom():从set终获取一个随机数,时间复杂度必须是O(1)。
Example:
Input
["RandomizedSet", "insert", "remove", "insert", "getRandom", "remove",
"insert", "getRandom"]
[[], [1], [2], [2], [], [1], [2], []]
Output
[null, true, false, true, 2, true, false, 2]
思路:
1.用一个HashMap储存插入元素的索引,一个List储存元素本身,插入的时候记录两者。
2.删除元素的时候如果直接根据索引从List移除元素需要O(n)时间,而且还要一并修改
map的索引值,我们改为把要被删除的元素和List的最后一个元素交换位置并删除最后
一个元素,这样只需要O(1)的时间。
remove(3) 交换元素并更新map(4)索引 移除最后一个元素
1 2 3 4 => 1 2 4 3 => 1 2 4
3.直接从List的随机索引取一个数字,这样取随机数就只需要O(1)时间了。
JavaCode:
作者: sustainer123 (caster)   2022-11-29 10:49:00
大师
作者: hahaha021225 (安安你好)   2022-11-29 10:50:00
大师

Links booklink

Contact Us: admin [ a t ] ucptt.com