LinkedHashMap
,但是這種做法不符合面試官的要求,所以我們只會在這裡介紹它背後的想法。class LRUCache(private val capacity: Int) : LinkedHashMap<Int?, Int?>(capacity, 0.75f, true) {
operator fun get(key: Int): Int {
return super.getOrDefault(key, -1)!!
}
fun put(key: Int, value: Int) {
super.put(key, value)
}
override fun removeEldestEntry(eldest: Map.Entry<Int?, Int?>): Boolean {
return size > capacity
}
}
跟一流的人才幹大事,享受成功進步的高級樂趣!
內推機會來啦!能與優秀的程式設計師共事,是特別痛快的事,因為厲害的工程師大神會刺激你想要迎頭趕上的上進心,尤其是一起討論解決方案時,他們會觸發你有更好的解決思維能力,彼此共同成長並且一起享受解謎與破關般的樂趣。 你一定聽得懂我在說甚麼感覺,趕快把握機會,動動手指投遞履歷吧! 立即加入「面試讀書會」,和大家一起準備面試!
內推機會 加入讀書會 (邀請碼:8484)
Deque
,一個是 MutableMap
。
Deque
可以讓我們在兩端插入或刪除資料,我們用它來按照使用頻率存儲資料的 key
,越靠近 queue 尾部的 key
表示越近期被使用過,越靠近 queue 頭部的 key
表示越久沒有被使用過。MutableMap
可以讓我們在 的時間內根據 key
找到對應的 value
,我們用它來存儲資料的 key
和 value
的對應關係。get
一筆資料時,我們先判斷 MutableMap
中是否包含這個 key
-1
表示沒有找到;Deque
中刪除這個 key
,然後再把它新增到 Deque
的尾部,表示它是最近被使用過的,最後回傳 MutableMap
中這個 key
對應的 value
。MutableMap
中是否包含這個 key
Deque
中刪除這個 key
,然後再把它新增到 Deque
的尾部,並更新 MutableMap
中這個 key
對應的 value
;Deque
是否已經達到容量限制,如果達到了,就從 Deque
的頭部刪除一個 key
,並從 MutableMap
中移除這個 key
和 value
的對應關係;然後再把新的 key
新增到 Deque
的尾部,並在 MutableMap
中新增新的 key
和 value
的對應關係。class LRUCache(private val capacity: Int) {
val deque: Deque<Int> = ArrayDeque<Int>(capacity)
val map = mutableMapOf<Int, Int>()
fun get(key: Int): Int {
if (map.contains(key)) {
deque.remove(key)
deque.offer(key)
}
return map[key] ?: -1
}
fun put(key: Int, value: Int) {
if (map.contains(key)) {
deque.remove(key)
} else if (deque.size >= capacity) {
val removeKey = deque.poll()
map.remove(removeKey)
}
deque.offer(key)
map[key] = value
}
}
時間複雜度:
對於 get
和 put
操作都是 ,因為 MutableMap
可以在 的時間內找到或更新一個 key
和 value
的對應關係,而 Deque
可以在 的時間內在兩端插入或刪除一個 key
。
空間複雜度:
,因為 MutableMap
和 Deque
最多存儲 個元素。
內推機會來啦!
跟一流的人才幹大事,享受成功進步的高級樂趣!
內推機會 加入讀書會 (邀請碼:8484)