LRU Cache

題目來源
題目的意思就是說給定大小固定的空間,然后要實現(xiàn)get,put操作,假如容量滿了,那么根據(jù)最近最少使用原則來進(jìn)行刪除,兩個操作都用O(1)的時間完成。
這道題我在之前京東面試的時候碰到了,然后當(dāng)時想了挺久,沒想出來。
看了看討論區(qū),實際上也不是很難,總的想法和我原來想的差不多,不過我對那些基本數(shù)據(jù)結(jié)構(gòu)的了解不夠透徹。
實際上就是需要一個哈希表以及一個雙鏈表,哈希表中key存的是就是key,value存的是雙鏈表的iterator,指向雙鏈表中存放對應(yīng)key的位置。
然后雙鏈表中存放值。
get操作,因為哈希表,所以是O(1)的,get操作后需要將對應(yīng)節(jié)點移到隊首。
然后復(fù)雜一點是put操作,首先需要考慮這個key在雙鏈表中是否已經(jīng)存在,存在的話就把雙鏈表的那個節(jié)點移到隊首來。假如不存在,首先需要判斷容量是否已滿,假如已經(jīng)滿了,就把隊尾刪掉。假如不滿,那么直接往隊首插入一個值即可。
其中比較復(fù)雜的操作實際上就是這個雙鏈表怎么移動,怎么把某個元素移到隊首,寫起來比較復(fù)雜。但是!STL已經(jīng)把你做好了,用splice操作直接來實現(xiàn)。
代碼如下:

class LRUCache {
public:
    LRUCache(int capacity) : m_capacity(capacity) {}
    
    int get(int key) {
        auto found_iter = m_map.find(key);
        if (found_iter == m_map.end())
            return -1;
        m_list.splice(m_list.begin(), m_list, found_iter->second);
        return found_iter->second->second;
    }
    
    void put(int key, int value) {
        auto found_iter = m_map.find(key);
        if (found_iter != m_map.end()) {
            found_iter->second->second = value;
            m_list.splice(m_list.begin(), m_list, found_iter->second);
            return;
        }
        if (m_map.size() == m_capacity) {
            int del_key = m_list.back().first;
            m_list.pop_back();
            m_map.erase(del_key);
        }
        m_list.emplace_front(key, value);
        m_map[key] = m_list.begin();
    }

private:
    size_t m_capacity;
    unordered_map<int, list<pair<int, int>>::iterator> m_map;
    list<pair<int, int>> m_list;
};

/**
 * Your LRUCache object will be instantiated and called as such:
 * LRUCache obj = new LRUCache(capacity);
 * int param_1 = obj.get(key);
 * obj.put(key,value);
 */
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Design and implement a data structure for Least Recently ...
    ShutLove閱讀 316評論 0 0
  • My code: 這道題目還是挺有意思的。一開始寫出來超出時間了,沒有怎么仔細(xì)分析。兩個操作,get,set,最理...
    Richardo92閱讀 457評論 0 0
  • 上周末同學(xué)問了一些操作系統(tǒng)的問題,涉及到LRU cache,順便復(fù)習(xí)了一下。LRU是least recently ...
    gzxultra閱讀 1,438評論 0 0
  • 題目 首先來看題目,就是實現(xiàn)一個LRU,最近最少使用。 Design and implement a data s...
    騷銘科技閱讀 2,028評論 0 3
  • 我愿送你一朵花,在清淺的日光下,讓它盛開在你的手中,綻放出粉色的夢。 我愿送你一朵花,在迷蒙的清晨,讓它盛開在你的...
    浮生半夏槿閱讀 353評論 0 0

友情鏈接更多精彩內(nèi)容