leetcode 381. O(1) 時間插入、刪除和獲取隨機元素 - 允許重復

設計一個支持在平均 時間復雜度 O(1) 下, 執行以下操作的數據結構。

注意: 允許出現重復元素。

insert(val):向集合中插入元素 val。
remove(val):當 val 存在時,從集合中移除一個 val。
getRandom:從現有集合中隨機獲取一個元素。每個元素被返回的概率應該與其在集合中的數量呈線性相關。
示例:

// 初始化一個空的集合。
RandomizedCollection collection = new RandomizedCollection();

// 向集合中插入 1 。返回 true 表示集合不包含 1 。
collection.insert(1);

// 向集合中插入另一個 1 。返回 false 表示集合包含 1 。集合現在包含 [1,1] 。
collection.insert(1);

// 向集合中插入 2 ,返回 true 。集合現在包含 [1,1,2] 。
collection.insert(2);

// getRandom 應當有 2/3 的概率返回 1 ,1/3 的概率返回 2 。
collection.getRandom();

// 從集合中刪除 1 ,返回 true 。集合現在包含 [1,2] 。
collection.remove(1);

// getRandom 應有相同概率返回 1 和 2 。
collection.getRandom();

代碼

class RandomizedCollection {Map<Integer,Integer> map=new HashMap<>();LinkedList<Integer> list=new LinkedList<>();//插入的數字鏈表Map<Integer,Boolean> booleanMap=new HashMap<>();//記錄當前索引中的數字是否可選Map<Integer,LinkedList<Integer>> queueMap=new HashMap<>();//數字對應的在數字鏈表的索引/** Initialize your data structure here. */public RandomizedCollection() {}/** Inserts a value to the collection. Returns true if the collection did not already contain the specified element. */public boolean insert(int val) {list.addLast(val);booleanMap.put(list.size()-1,true);if(!queueMap.containsKey(val)){queueMap.put(val,new LinkedList<>());}queueMap.get(val).add(list.size()-1);//插入當前數字的數字鏈表的索引if(map.containsKey(val)&&map.get(val)>0){map.put(val,map.get(val)+1);return false;}else{map.put(val, 1);return true;}}/** Removes a value from the collection. Returns true if the collection contained the specified element. */public boolean remove(int val) {if(!queueMap.containsKey(val)||queueMap.get(val).isEmpty()) return false;int cur=queueMap.get(val).removeFirst();//移出索引鏈表booleanMap.put(cur,false);//標記為不可選if(map.containsKey(val)&&map.get(val)>0){map.put(val,map.get(val)-1);return true;}else return false;}/** Get a random element from the collection. */public int getRandom() {Random random=new Random();int c=random.nextInt(list.size());while (!booleanMap.get(c))//跳過不可選的位置c=random.nextInt(list.size());return list.get(c);}}
/*** Your RandomizedCollection object will be instantiated and called as such:* RandomizedCollection obj = new RandomizedCollection();* boolean param_1 = obj.insert(val);* boolean param_2 = obj.remove(val);* int param_3 = obj.getRandom();*/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/392741.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/392741.shtml
英文地址,請注明出處:http://en.pswp.cn/news/392741.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MAYA建模桌面一角_maya怎么建模逼真的學生書桌書桌桌面?

今天我們就來看看使用maya建模學生書桌的方法&#xff0c;這是實例教程&#xff0c;請看下文詳細介紹。NURBS曲線的基礎知識&#xff1a;NURBS曲面是由網狀的曲線組合而成&#xff0c;在maya中可以使用creat菜單下的CV Curve Tool(CV曲線工具)EP Curve Tool(EP曲線工具)來創建曲…

expect 批量修改服務器用戶密碼

每個技術人員離職&#xff0c;留下的人 就要修改他的服務器賬號密碼&#xff0c;很麻煩&#xff0c;故寫次腳本偷懶 change.sh 如下 12345678910#!/bin/bashfor i in awk {print $1} account.txt dojawk -v l"$i" {if(l$1)print $2} account.txt aawk -v l"$i&q…

虛擬機安裝服務器2008,VMware Workstation 虛擬機安裝64位windows 2008 R2 系統

偶看現在使用的電腦是 惠普 康柏 Elite 8300 MT Mini Tower&#xff0c;操作系統 Windows 7 旗艦版 64位基本硬件展示處理器 英特爾 第三代酷睿 i5-3470 3.20GHz 四核主板 惠普 3397內存 8 GB ( 記憶科技 DDR3 1600MHz / 鎂光 DDR3 1600MHz )主硬盤 西數 WDC WD5000AAKX-60U6A…

黑客入門之單機游戲外掛

轉載于: http://www.cnblogs.com/huipengbo/p/6887170.html 一.本文以植物大戰僵尸外掛的編寫為例&#xff0c;介紹單機游戲外掛的編寫和使用過程。 1.啟動單機游戲如&#xff1a;植物大戰僵尸如下圖 2.想明白我們寫外掛的目的&#xff1a;讓我們有充足的陽光數量來使用&#x…

如何使用瀏覽器控制臺通過JavaScript抓取并將數據保存在文件中

by Praveen Dubey通過Praveen Dubey 如何使用瀏覽器控制臺通過JavaScript抓取并將數據保存在文件中 (How to use the browser console to scrape and save data in a file with JavaScript) A while back I had to crawl a site for links, and further use those page links …

poj2017

1&#xff0e;鏈接地址 https://vjudge.net/problem/POJ-2017 2&#xff0e;問題描述 Bill and Ted are taking a road trip. But the odometer in their car is broken, so they dont know how many miles they have driven. Fortunately, Bill has a working stopwatch, so t…

NFL原則告訴我們做決策的時候,試圖找到一個能解決所有問題,“大而全”的方案是不存在的。我們應當找到最關心的問題,因地制宜做出選擇。——聚焦目標,取舍有道!...

資源匱乏原則&#xff1a; 有限的資源無法滿足無窮的需要及欲望&#xff1b; 因此想要多一點的某件東西&#xff0c;意味著必須放棄一些其他的東西&#xff1b; 因為資源匱乏&#xff0c;所以我們必須做出選擇。 NFL原則&#xff1a;沒有免費午餐定理(No Free Lunch)是wolpert和…

巨無霸Win8PE X64服務器維護專用,【13年4月4日】維護版win8pe【32位+64位+純64位】(支持BIOS+EFI)...

因為單獨一個PE是不夠用的&#xff0c;已經制作了合盤&#xff0c;可BIOS啟動&#xff0c;也可EFI啟動。詳情移步》歡迎下載使用&#xff0c;覺得好的話&#xff0c;請回帖支持一下&#xff0c;您的支持&#xff0c;就是我的動力。。。。預祝大家新的一年合家歡樂&#xff01;工…

linux子線程運行的函數_Linux中線程使用詳解

4. 線程的屬性前面還說到過線程創建的時候是有屬性的&#xff0c;這個屬性由一個線程屬性對象來描述。線程屬性對象由pthread_attr_init()接口初始化&#xff0c;并由pthread_attr_destory()來銷毀&#xff0c;它們的完整定義是&#xff1a;int pthread_attr_init(pthread_attr…

數據源 連接oracle

https://blog.csdn.net/kk185800961/article/details/53065257 轉載于:https://www.cnblogs.com/BelieveFish/p/11164009.html

leetcode 140. 單詞拆分 II(記憶化)

給定一個非空字符串 s 和一個包含非空單詞列表的字典 wordDict&#xff0c;在字符串中增加空格來構建一個句子&#xff0c;使得句子中所有的單詞都在詞典中。返回所有這些可能的句子。 說明&#xff1a; 分隔時可以重復使用字典中的單詞。 你可以假設字典中沒有重復的單詞。 …

java mvp開發_如何從沒有軟件開發技能的想法變成現實的市場MVP???

java mvp開發by Mike Williams由Mike Williams 如何從沒有軟件開發技能的想法變成現實的市場MVP&#xff1f;?&#xff1f; (How to go from idea to live marketplace MVP with no software development skills ???) Online marketplaces such as Airbnb, Turo, Hipcamp,…

Convolutional neural networks for artistic style transfer

https://harishnarayanan.org/writing/artistic-style-transfer/ 轉載于:https://www.cnblogs.com/guochen/p/6888478.html

Centos 安裝 禪道

Centos 安裝 禪道 一、環境準備&#xff1a; 1、服務器&#xff1a;Centos6.7 新系統 2、查看對應的系統版本&#xff1a;uname -a和cat /etc/redhat CentOS release 6.7 (Final) 二、安裝&#xff1a; 1、下載對應系統版本的zbox禪道一鍵安裝包&#xff0c;解壓至/opt目錄下 …

centos7修改服務器密碼忘記,Centos7忘記root密碼怎么修改

Centos7忘記root密碼怎么修改一、 reboot重啟機器&#xff0c;當出現引導界面時&#xff0c;按e進入內核編輯界面。二、 往下翻&#xff0c;到LANGzh_CN.UTF-8后面添加 \rd.break(別忘了空格)三&#xff0c; 修改完成后&#xff0c;按下CtrlX組合鍵來運行這個修改后的內核程序(…

1.移動端測試知識筆記(面試必備,測試點,adb命令)

移動端測試&#xff1a; 移動應用&#xff0c;特性(功能) 滿足 需求(產品文檔&#xff0c;隱性需求) 一。App功能測試&#xff1a; 死活背下來1.業務邏輯正確性測試&#xff1a; 產品文檔&#xff0c;隱性需求- 寫成測試用例 2.兼容性測試&#xff1a; 1.系統版本&#xff1a…

Day 3 網絡基礎

網絡基礎 一、什么是互聯網協議及為何要有互聯網協議 &#xff1f; 互聯網協議&#xff1a;指的就是一系列統一的標準&#xff0c;這些標準稱之為互聯網協議。互聯網的本質就是一系列的協議&#xff0c;總稱為‘互聯網協議’&#xff08;Internet Protocol Suite)。 互聯網協議…

leetcode 349. 兩個數組的交集

給定兩個數組&#xff0c;編寫一個函數來計算它們的交集。 示例 1&#xff1a; 輸入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 輸出&#xff1a;[2] 示例 2&#xff1a; 輸入&#xff1a;nums1 [4,9,5], nums2 [9,4,9,8,4] 輸出&#xff1a;[9,4] 代碼 class Solution…

a4988 脈寬要求_基于STM32的微型步進電機驅動控制器設計

基于STM32的微型步進電機驅動控制器設計摘 要&#xff1a; 設計了一種微型步進電機驅動控制器&#xff0c;通過上位機界面修改步進電機轉速、旋轉角度、細分系數。該設計以STM32F103T8U6作為主控制器&#xff0c;以A4988步進電機驅動設備&#xff0c;上位機串口界面作為人機接口…

運行linux的機器死機了_如何在任何機器上輕松運行任何Linux工具

運行linux的機器死機了by Flavio De Stefano由弗拉維奧德斯特凡諾(Flavio De Stefano) 如何在任何機器上輕松運行任何Linux工具 (How to easily run any Linux tool on any machine) Have you ever encountered a situation like the ones below?您是否遇到過以下情況&#x…