LeetCode:常數(shù)時間插入刪除獲取元素

380. 常數(shù)時間插入暮顺、刪除和獲取隨機元素

設計一個支持在*平均 *時間復雜度 O(1) 下厅篓,執(zhí)行以下操作的數(shù)據(jù)結(jié)構。

  1. insert(val):當元素 val 不存在時捶码,向集合中插入該項羽氮。
  2. remove(val):元素 val 存在時,從集合中移除該項惫恼。
  3. getRandom:隨機返回現(xiàn)有集合中的一項档押。每個元素應該有相同的概率被返回。
思路:

構建兩個map祈纯,第一個map存儲<val令宿,index>,index為val進入map的的順序腕窥,可根據(jù)val查找index粒没;第二個map存儲<index,val>正好和第一個反過來簇爆,可根據(jù)index查找val癞松。還需要維護一個size,表示當前有幾個元素入蛆。
插入:先判斷能否插入响蓉,若能則兩個map均插入,同時size+1哨毁;
獲确慵住:返回第二個map的一個隨機索引;
刪除:先判斷第一個map是否存在待刪除元素挑庶,若存在言秸,則根據(jù)第一個map獲取待刪除val的index,并將該index賦值給第一個map的最后一個元素迎捺,并將該元素賦值給第二個map對應的index举畸,最后將第一個map對應的val條目刪除,將第二個map的最后一個index刪除凳枝,并將size-1抄沮。這種操作保證了index的連續(xù)性跋核,獲取隨機元素時能保證取得到。

c++語言細節(jié):

兩個map要做為類的數(shù)據(jù)成員叛买,不能聲明在某個函數(shù)中砂代;
map.find(K),如果map中存在K率挣,則返回指向該元素得迭代器刻伊,若不存在,則返回end()尾后迭代器椒功;
可以通過map[k]=val捶箱,進行賦值;
map.erase(it)动漾,是接收迭代器參數(shù)的丁屎;
c++沒有生成0-1的隨機數(shù)發(fā)生器,可以通過rand()%n旱眯,來獲取0~n-1之間的整數(shù)晨川;

class RandomizedSet {
public:
    map<int, int> kindex; // 第一個map k index
    map<int, int> indexK; // 第二個map index K
    int size; //元素個數(shù)
    /** Initialize your data structure here. */
    RandomizedSet() {

        size = 0;
    }

    /** Inserts a value to the set. Returns true if the set did not already contain the specified element. */
    bool insert(int val) {
        auto it = kindex.find(val);
        if (it == kindex.end()) //說明該元素不存在,可以插入
        {
            kindex[val] = size;
            indexK[size++] = val;
            return true;
        }
        else
            return false;
    }

    /** Removes a value from the set. Returns true if the set contained the specified element. */
    bool remove(int val) {
        auto it = kindex.find(val);
        if (it != kindex.end()) //說明map中有該元素删豺,可以刪除
        {
            int index = kindex[val];  //獲取該元素對應的index
            int lastIndex = --size;  // 獲取最后一個元素的index
            int lastK = indexK[lastIndex];  //獲取最后一個元素的值
            indexK[index] = lastK;  //將待刪除元素對應的index的值改忘最后一個元素的值
            kindex[lastK] = index; //將最后一個元素的index改為待刪除元素的index
            indexK.erase(lastIndex);//刪除最后一個元素的原索引
            kindex.erase(val); //刪除待刪除元素的值
            return true;
        }
        else
            return false;
    }

    /** Get a random element from the set. */
    int getRandom() {
        if (size == 0) //沒有元素了共虑,返回0
            return 0;

        int index = rand() % size; //返回0~size-1
        return indexK[index];
    }
};
/**
 * Your RandomizedSet object will be instantiated and called as such:
 * RandomizedSet* obj = new RandomizedSet();
 * bool param_1 = obj->insert(val);
 * bool param_2 = obj->remove(val);
 * int param_3 = obj->getRandom();
 */
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市呀页,隨后出現(xiàn)的幾起案子看蚜,更是在濱河造成了極大的恐慌,老刑警劉巖赔桌,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異渴逻,居然都是意外死亡疾党,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門惨奕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雪位,“玉大人,你說我怎么就攤上這事梨撞”⑾矗” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵卧波,是天一觀的道長时肿。 經(jīng)常有香客問我,道長港粱,這世上最難降的妖魔是什么螃成? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任旦签,我火速辦了婚禮,結(jié)果婚禮上寸宏,老公的妹妹穿的比我還像新娘宁炫。我一直安慰自己,他們只是感情好氮凝,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布羔巢。 她就那樣靜靜地躺著,像睡著了一般罩阵。 火紅的嫁衣襯著肌膚如雪竿秆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天永脓,我揣著相機與錄音袍辞,去河邊找鬼。 笑死常摧,一個胖子當著我的面吹牛搅吁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播落午,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼谎懦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了溃斋?” 一聲冷哼從身側(cè)響起界拦,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎梗劫,沒想到半個月后享甸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡梳侨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年蛉威,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片走哺。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蚯嫌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出丙躏,到底是詐尸還是另有隱情择示,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布晒旅,位于F島的核電站栅盲,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏敢朱。R本人自食惡果不足惜剪菱,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一摩瞎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧孝常,春花似錦旗们、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至喜颁,卻和暖如春稠氮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背半开。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工隔披, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人寂拆。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓奢米,卻偏偏與公主長得像,于是被迫代替她去往敵國和親纠永。 傳聞我的和親對象是個殘疾皇子鬓长,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353