国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

二刷LeetCode--146.LRU緩存(C++版本),必會(huì)題目

這篇具有很好參考價(jià)值的文章主要介紹了二刷LeetCode--146.LRU緩存(C++版本),必會(huì)題目。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

本題思路:因?yàn)樾枰涗浽氐某鋈腠樞?并且每次訪問(wèn)之后需要將該節(jié)點(diǎn)提到最前面,因此需要使用雙向鏈表(單鏈表不方便刪除操作),而為了可以在常量時(shí)間復(fù)雜度內(nèi)找到對(duì)應(yīng)的元素,我們需要使用哈希表,將每一個(gè)插入的元素在哈希表中進(jìn)行記錄.哈希表的key就是插入的key,而哈希表的value應(yīng)該對(duì)應(yīng)的是雙向鏈表的一個(gè)節(jié)點(diǎn).注意:我們可能會(huì)想,既然使用哈希表,那么雙鏈表中只需要存儲(chǔ)value就可以,為什么還需要存儲(chǔ)key呢.這個(gè)在執(zhí)行最久未使用的節(jié)點(diǎn)刪除的時(shí)候可以發(fā)現(xiàn),如果雙向鏈表中只是存儲(chǔ)了value,那么刪除的時(shí)候就不能將哈希表中的記錄刪除掉.文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-647226.html

class LRUCache {
public:
    // 定義雙向鏈表
    struct node 
    {
        int  key, value;
        struct node *left, *right;
        // k-v及左右指針的初始化
        node(int _key, int _value):key(_key), value(_value), left(NULL), right(NULL){}
    }*L, *R;
    // 定義鏈表容量以及哈希表
    int n;
    unordered_map<int, node*> hash;

    // 移除節(jié)點(diǎn),移除的是最右端的節(jié)點(diǎn),即尾節(jié)點(diǎn)(R)之前的那個(gè)
    void remove(node *p)
    {
        p -> right -> left = p -> left;
        p -> left -> right = p -> right;
    }

    // 新節(jié)點(diǎn)插入函數(shù),在頭節(jié)點(diǎn)(L)之后
    void insert(node *p)
    {
        p -> right = L -> right;
        p -> left = L;
        L -> right -> left = p;
        L -> right = p;
    }

    // 新被訪問(wèn)的節(jié)點(diǎn)放在最左邊,最右端的節(jié)點(diǎn)就是待刪除結(jié)點(diǎn),使用哈希表記錄元素是否出現(xiàn)
    LRUCache(int capacity) 
    {
        n = capacity;
        // 首尾節(jié)點(diǎn)初始化
        L = new node(-1, -1), R = new node(-1, -1);
        // 初始化之后鏈表指針賦值
        L -> right = R;
        R -> left = L;
    }
    
    int get(int key) 
    {
        // 檢查哈希表中該元素出現(xiàn)的次數(shù)
        if(hash.count(key) == 0)
            return -1;
        // 如果出現(xiàn)過(guò),那么就把該元素插入到頭部,并且刪除該節(jié)點(diǎn)
        // 哈希表的value存的是節(jié)點(diǎn)(結(jié)構(gòu)體指針類(lèi)型)
        struct node *p = hash[key];
        remove(p);
        insert(p);
        return p -> value;
    }
    
    void put(int key, int value) 
    {
        // 如果key存在,那么只需要修改value即可
        if(hash.count(key) != 0)
        {
            auto p = hash[key];
            // struct node *p = hash[key];
            p -> value = value;
            // 每訪問(wèn)一次就需要重新刪除重新插入到頭部
            remove(p);
            insert(p);
        }
        else
        {
            // 首先判斷是不是到達(dá)容量上限
            if(hash.size() == n)
            {
                // 刪除最右邊的數(shù)據(jù)節(jié)點(diǎn)
                struct node *p = R -> left;
                remove(p);
                // 更新哈希表
                hash.erase(p -> key);
                delete p;
            }
            // 否則就直接插入新節(jié)點(diǎn)即可
            struct node *p = new node(key, value);
            insert(p);
            hash[key] = p;
        }
    }
};

/**
 * 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);
 */

到了這里,關(guān)于二刷LeetCode--146.LRU緩存(C++版本),必會(huì)題目的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • leetcode做題筆記146. LRU 緩存

    請(qǐng)你設(shè)計(jì)并實(shí)現(xiàn)一個(gè)滿足??LRU (最近最少使用) 緩存?約束的數(shù)據(jù)結(jié)構(gòu)。 實(shí)現(xiàn)? LRUCache ?類(lèi): LRUCache(int capacity) ?以? 正整數(shù) ?作為容量? capacity ?初始化 LRU 緩存 int get(int key) ?如果? key ?存在于緩存中,則返回的值,否則返回? -1 ?。 void put(int key, int value) ?如果

    2024年02月07日
    瀏覽(25)
  • Leetcode 146. LRU 緩存(Hashmap+雙鏈表)

    請(qǐng)你設(shè)計(jì)并實(shí)現(xiàn)一個(gè)滿足 LRU (最近最少使用) 緩存 約束的數(shù)據(jù)結(jié)構(gòu)。 實(shí)現(xiàn) LRUCache 類(lèi): ● LRUCache(int capacity) 以 正整數(shù) 作為容量 capacity 初始化 LRU 緩存 ● int get(int key) 如果 key 存在于緩存中,則返回的值,否則返回 -1 。 ● void put(int key, int value) 如果 key 已

    2024年02月16日
    瀏覽(34)
  • 【數(shù)據(jù)結(jié)構(gòu)】LRU緩存的簡(jiǎn)單模擬實(shí)現(xiàn)(leetcode力扣146LRU緩存)

    【數(shù)據(jù)結(jié)構(gòu)】LRU緩存的簡(jiǎn)單模擬實(shí)現(xiàn)(leetcode力扣146LRU緩存)

    LRU是Least Recently Used的縮寫(xiě),意思是最近最少使用,它是一種Cache替換算法。 Cache的容量有限,因此當(dāng)Cache的容量用完后,而又有新的內(nèi)容需要添加進(jìn)來(lái)時(shí), 就需要挑選并舍棄原有的部分內(nèi)容,從而騰出空間來(lái)放新內(nèi)容。LRU Cache 的替換原則就是將最近最少使用的內(nèi)容替換掉。

    2024年02月03日
    瀏覽(23)
  • [力扣146. LRU 緩存 ](https://leetcode.cn/problems/lru-cache/description/)

    力扣146. LRU 緩存 使用LinkedHashmap(HashMap的子類(lèi),能夠記住插入數(shù)據(jù)的順序). LRU是Lease Recently User的縮寫(xiě),意思是最近 最少使用。比如設(shè)計(jì)一個(gè)文件緩存系統(tǒng),每個(gè)文件有自己的大小和訪問(wèn)時(shí)間,文件緩存系統(tǒng)有總的大小,當(dāng)往這個(gè)文件系統(tǒng)中放入新的文件時(shí),如果發(fā)現(xiàn)超出文件

    2024年02月11日
    瀏覽(54)
  • 每日兩題 / 142. 環(huán)形鏈表 II & 146. LRU 緩存(LeetCode熱題100)

    每日兩題 / 142. 環(huán)形鏈表 II & 146. LRU 緩存(LeetCode熱題100)

    142. 環(huán)形鏈表 II - 力扣(LeetCode) 用哈希記錄走過(guò)的節(jié)點(diǎn)即可 146. LRU 緩存 - 力扣(LeetCode) O ( 1 ) O(1) O ( 1 ) 地查找并修改kv結(jié)構(gòu),用unordered_map即可解決 問(wèn)題是題目要求:哈希表容量有限,超出容量時(shí),將刪除最久未訪問(wèn)的kv 那么關(guān)鍵就在于:如何用數(shù)據(jù)結(jié)構(gòu)表示訪問(wèn)的先后順

    2024年04月16日
    瀏覽(26)
  • 146. LRU 緩存

    請(qǐng)你設(shè)計(jì)并實(shí)現(xiàn)一個(gè)滿足 LRU (最近最少使用) 緩存 約束的數(shù)據(jù)結(jié)構(gòu)。 實(shí)現(xiàn) LRUCache 類(lèi): LRUCache(int capacity) 以 正整數(shù) 作為容量 capacity 初始化 LRU 緩存 int get(int key) 如果 key 存在于緩存中,則返回的值,否則返回 -1 。 void put(int key, int value) 如果 key 已經(jīng)存在,

    2024年02月12日
    瀏覽(28)
  • LeetCode刷題---LRU緩存

    LeetCode刷題---LRU緩存

    LRU是Least Recently Used的縮寫(xiě),即最近最少使用,是一種內(nèi)存管理算法,也可以用作緩存淘汰策略。 這種算法的核心思想是:如果數(shù)據(jù)最近被訪問(wèn)過(guò),那么將來(lái)被訪問(wèn)的幾率也更高。 因此,當(dāng)內(nèi)存或緩存容量有限,需要淘汰部分?jǐn)?shù)據(jù)時(shí),LRU算法會(huì)優(yōu)先淘汰那些最長(zhǎng)時(shí)間未被訪問(wèn)

    2024年02月22日
    瀏覽(24)
  • (力扣記錄)146. LRU 緩存

    數(shù)據(jù)類(lèi)型 :鏈表 時(shí)間復(fù)雜度: O(1) 空間復(fù)雜度: O(N) 代碼實(shí)現(xiàn):

    2024年01月18日
    瀏覽(21)
  • 二刷LeetCode--48. 旋轉(zhuǎn)圖像(C++版本),數(shù)學(xué)題

    思路:主要是觀察變化之后的數(shù)組和最開(kāi)始的數(shù)組的區(qū)別,不難發(fā)現(xiàn),先轉(zhuǎn)置在左右鏡像對(duì)稱即可。需要注意的是轉(zhuǎn)置和鏡像對(duì)稱中for變量的終止條件。

    2024年02月12日
    瀏覽(19)
  • 【leetcode100-035】【鏈表/哈希鏈表】LRU緩存

    【題干】 請(qǐng)你設(shè)計(jì)并實(shí)現(xiàn)一個(gè)滿足??LRU (最近最少使用) 緩存?約束的數(shù)據(jù)結(jié)構(gòu)。 實(shí)現(xiàn)? LRUCache ?類(lèi): LRUCache(int capacity) ?以? 正整數(shù) ?作為容量? capacity ?初始化 LRU 緩存 int get(int key) ?如果? key ?存在于緩存中,則返回的值,否則返回? -1 ?。 void put(int key, in

    2024年02月01日
    瀏覽(57)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包