380. Insert Delete GetRandom O(1) - Medium
前往題目
想法
經過這麼多演算法的洗禮還有自修的演算法課程,總算沒讓自己失望:D以下是分析
- 如果使用
array
,insert
和remove
都需要index
,但是傳入的值是value
,每次都要花時間搜尋。如果使用Map
來儲存映射關係那還要處理array
擴增的問題,所以不選這個 - 如果用
LinkedList
,insert
可以O(1)
,但是remove
和getRandom
都要O(n)
,也不方便;就算是double LinkedList
也沒用,都沒辦法瞬間定位到value
的地方 - 如果使用
HashMap
,雖然insert
和remove
都是O(1)
時間,但getRandom
就沒有這麼方便了,最差需要O(n)
,因為HashMap
沒有index
,這方面可以用ArrayList
來補足,一方面解決了array
擴增的問題,還能提供insert
以及remove
的O(1)
甚至getRandom
的時候也可以直接用隨機數在O(1)
的時間找到該隨機index
的值並回傳
思路
差了一點點,remove
那邊原來是需要補足空位的,不然arraylist
擴充或縮減的時候會打亂index
。和尾巴調換就可以完美又簡單的解決這個問題
- 使用
hashmap
和arraylist
,hashmap
儲存value
和index
的映射關係,arraylist
儲存所有數值方便快速存取 insert
只要簡單的放到arraylist
最後面,map
更新一下映射就可以remove
需要特別注意不能有空位,所以把要remove
的那位先跟尾巴調換,再進行移除getRandom
非常簡單,用java
自帶的Random()
,範圍就是arraylist
的size
,才不會出界
Code
2024/05/08
- 簡單,不過
remove
錯了😭
380. Insert Delete GetRandom O(1) - Medium
https://f88083.github.io/2024/01/25/380-Insert-Delete-GetRandom-O-1-Medium/