力扣面試150(13/150)

7.3 380. O(1) 時間插入、刪除和獲取隨機元素

實現RandomizedSet 類:

  • RandomizedSet() 初始化 RandomizedSet 對象
  • bool insert(int val) 當元素 val 不存在時,向集合中插入該項,并返回 true ;否則,返回 false
  • bool remove(int val) 當元素 val 存在時,從集合中移除該項,并返回 true ;否則,返回 false
  • int getRandom() 隨機返回現有集合中的一項(測試用例保證調用此方法時集合中至少存在一個元素)。每個元素應該有 相同的概率 被返回。

你必須實現類的所有函數,并滿足每個函數的 平均 時間復雜度為 O(1)

之前沒有寫過類,現在寫起來確實有點不太順手,多練練就好啦!

我們要維護兩個對象:

  • 隨機訪問(getRandom()):數組支持 O(1) 時間復雜度的隨機訪問(通過索引直接獲取元素),而哈希表(Map)雖然可以快速查找元素是否存在,但無法直接隨機訪問元素。
  • 存儲元素順序:數組可以按插入順序存儲元素,而哈希表是無序的,無法直接支持隨機訪問。

插入邏輯:判斷是否存在(map高效判斷)+數組push+map.set

刪除邏輯:將最后一個數覆蓋要刪除的數,然后刪除最后一個數(數組pop),map(delete)

我的代碼:

class RandomizedSet {// 第一次寫集合還挺不習慣的// 不能在構造函數里面創造,要考慮作用域的問題private map: Map<number, number>; // 值到索引的映射private nums: number[]; // 存儲所有值的數組constructor() {// 進行初始化this.map = new Map();this.nums = [];}insert(val: number): boolean {// 如果有數字就要插入到map末尾if(this.map.has(val)){// 已經存在返回falsereturn false;}else {// 長度剛好比索引多一個this.map.set( val , this.nums.length);this.nums.push(val);return true;}}remove(val: number): boolean {// 如果有的話就刪除removeif(!this.map.has(val)){return false;}// 有值就要刪除// 因為數組只有刪除前面或者刪除后面,我們想要達到O(1)就不能夠遍歷// 我們把要刪除的數一道最后一個位置,直接pop// 得到index:const index = this.map.get(val);// 獲取最后一個數let lastValue = this.nums[this.nums.length - 1];// 進行替換,同時要替換map的最后一個書的索引this.nums[index] = lastValue;this.map.set(lastValue  , index);// 刪除最后一個數字this.nums.pop();this.map.delete(val);return true;}getRandom(): number {const randomIndex = Math.floor(Math.random() * this.nums.length);return this.nums[randomIndex];}
}/*** Your RandomizedSet object will be instantiated and called as such:* var obj = new RandomizedSet()* var param_1 = obj.insert(val)* var param_2 = obj.remove(val)* var param_3 = obj.getRandom()*/// O(1):哈希表
// 數組的一些方法:includes,pop

總結:

RandomizedSet 類通過結合哈希表和數組來實現。哈希表用于快速查找元素是否存在及其在數組中的索引,數組用于支持隨機訪問和高效地添加、刪除元素。插入時,元素被添加到數組末尾,并在哈希表中記錄其索引;刪除時,通過交換待刪除元素與數組末尾元素的方式,確保刪除操作的時間復雜度為 O(1);獲取隨機元素時,通過生成隨機索引直接從數組中獲取。這種組合使得所有操作都能在平均 O(1) 時間內完成。

7.3 238. 除自身以外數組的乘積

給你一個整數數組 nums,返回 數組 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘積 。

題目數據 保證 數組 nums之中任意元素的全部前綴元素和后綴的乘積都在 32 位 整數范圍內。

請 **不要使用除法,**且在 O(n) 時間復雜度內完成此題。

我最開始的思路:

當前的數的左邊的數乘右邊的數

我的代碼:

function productExceptSelf(nums: number[]): number[] {// 當前的數let cur = 0;// 左邊的指針let left = 0 ;// 右邊的指針let right = 0 ; // 對每一個都要進行遍歷// 最后的答案let ans = [] ;let subLeft = 1 ;let subRight = 1 ;  for(cur ; cur < nums.length ; cur++){left=0;right = nums.length - 1;subLeft = 1 ;subRight = 1;// `左邊while(left < cur){subLeft = subLeft * nums[left];left++;}// 右邊while(right > cur){subRight = subRight * nums[right];right--;}ans.push(subLeft * subRight);}return ans;
}

時間超限:雙重循環(外層 for 循環 + 內層兩個 while 循環),導致時間復雜度為 O(n2)

優化:也是左邊成右邊的,但是我們先左邊乘積:從左到右遍歷,ans[i] 初始化為左邊所有元素的乘積。然后右邊乘積:從右到左遍歷,將 ans[i] 乘以右邊所有元素的乘積。

優化后的代碼:

function productExceptSelf(nums: number[]): number[] {// 對每一個都要進行遍歷// 最后的答案let ans = [] ;let subLeft = 1 ;let subRight = 1 ; for(let i = 0 ;i < nums.length ; i++){ans[i] = subLeft;subLeft *= nums[i];}for(let i = nums.length - 1 ; i >= 0   ; i--){ans[i] *= subRight;subRight *= nums[i];}return ans;
}

總結:計算每一個nums[i]的左邊,再和右邊相乘得到結果

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

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

相關文章

需要scl來指定編譯器的clangd+cmake在vscode/cursor開發環境下的配置

最近cursor更新了插件商店&#xff0c;只能使用默認它魔改的c/c插件&#xff08;基于clangd的&#xff09;&#xff0c;手頭剛好在折騰一個cmake工程&#xff0c;試試水嘗試直接配置在cursor上可以編譯運行。 主要是本地環境使用scl來管理gcc/g&#xff0c;所以在配置過程中需要…

docker離線/在線環境下安裝elasticsearch

如果想離線安裝docker、redis、gninx、mysql可參照下面這個。 離線環境下&#xff0c;docker安裝redis、ngnix、mysql 獲取離線包 方式1 找一個能上網的環境&#xff0c;下載elasticsearch的鏡像&#xff0c;然后將這個鏡像導出 docker pull docker.elastic.co/elasticsear…

響應式編程入門教程第一節:揭秘 UniRx 核心 - ReactiveProperty - 讓你的數據動起來!

響應式編程入門教程第一節&#xff1a;揭秘 UniRx 核心 - ReactiveProperty - 讓你的數據動起來&#xff01;-CSDN博客 響應式編程入門教程第二節&#xff1a;構建 ObservableProperty&#xff1c;T&#xff1e; — 封裝 ReactiveProperty 的高級用法-CSDN博客 今天我們來聊聊…

單片機:STM32F103的開發環境搭建

本文將詳細介紹如何搭建STM32F103的開發環境。STM32F103是STMicroelectronics推出的一款基于ARM Cortex-M3內核的32位微控制器&#xff08;MCU&#xff09;&#xff0c;廣泛應用于嵌入式開發。以下是搭建開發環境的詳細步驟&#xff0c;涵蓋硬件準備、軟件安裝、工具鏈配置及簡…

eNSP中實現vlan間路由通信(路由器)

eNSP中實現vlan間路由通信&#xff08;路由器&#xff09; 拓撲圖PC配置 pc1&#xff1a;192.168.10.1255.255.255.0192.168.10.254pc2&#xff1a;192.168.20.1255.255.255.0192.168.20.254pc3&#xff1a; 192.168.10.2255.255.255.0192.168.10.254pc4:192.168.20.2255.255.2…

spring6合集——spring概述以及OCP、DIP、IOC原則

spring6合集——Spring6核心知識點總結啟示錄一、SOLID原則1. 單一職責原則&#xff08;SRP&#xff09;2. 開閉原則&#xff08;OCP&#xff09;3. 里氏替換原則&#xff08;LSP&#xff09;4. 接口隔離原則&#xff08;ISP&#xff09;5. 依賴倒置原則&#xff08;DIP&#x…

Stata如何做機器學習?——SHAP解釋框架下的足球運動員價值驅動因素識別:基于H2O集成學習模型

SHAP解釋框架下的足球運動員價值驅動因素識別——基于H2O集成學習模型? 歡迎關注 「阿水實證通」&#xff0c;前沿方法時刻看&#xff01;&#x1f31f;&#x1f31f;&#x1f31f; 文章目錄 SHAP解釋框架下的足球運動員價值驅動因素識別——基于H2O集成學習模型?聚焦&…

基于Android的益智游戲學習系統

博主介紹&#xff1a;java高級開發&#xff0c;從事互聯網行業多年&#xff0c;熟悉各種主流語言&#xff0c;精通java、python、php、爬蟲、web開發&#xff0c;已經做了多年的畢業設計程序開發&#xff0c;開發過上千套畢業設計程序&#xff0c;沒有什么華麗的語言&#xff0…

Oracle11G Linux版本(linux_x86_64_oracle11.2.0.4)

Oracle11G Linux版本 linux_x86_64_oracle11.2.0.4 文件分割成 七個 壓縮包&#xff0c;必須集齊 七個 文件后才能一起解壓一起使用&#xff1a; p13390677_112040_Linux-x86-64_7of7.zip下載地址&#xff1a; https://download.csdn.net/download/weixin_43800734/20303421 p1…

C++20中的counting_semaphore的應用

一、std::counting_semaphore 在前面介紹過C20中的同步庫&#xff0c;其中就提到過std::counting_semaphore。但當時的重點是同步庫的整體介紹&#xff0c;本文則會對std::counting_semaphore這個信號量進行一個全面的分析和說明&#xff0c;并有針對性的給出具體的例程。 C20中…

mongo常用命令

1 連接mongo服務器 mongo ip:端口/庫名 -u 用戶名 -p 密碼 2 選擇數據庫 show dbs; 顯示數據庫列表 use 數據庫名稱; 3 集合操作 &#xff08;1&#xff09; 顯示集合列表 show tables; &#xff08;2&#xff09;刪除集合 db.集合名稱.drop(); &#xff08;3&#x…

華為云 銀河麒麟 vscode遠程連接

解決方案 檢查 SSH 服務器配置&#xff1a; 在遠程主機上編輯 /etc/ssh/sshd_config 文件 關鍵配置說明&#xff1a; AllowTcpForwarding yes # 允許TCP端口轉發&#xff08;必須開啟&#xff09; AllowAgentForwarding yes # 允許SSH代理轉發&#xff08;可選&#xf…

有限狀態機(Finite State Machine)

文章目錄有限狀態機&#xff08;Finite State Machine&#xff09;簡介狀態機的組成六要素(1) 狀態集合(2) 初態(3) 終態(4) 輸入符號集(5) 輸出符號集(6) 狀態轉移函數狀態機的工作四要素(1) 現態(2) 輸入(3) 輸出(4) 次態FPGA中的狀態機模型1. Moore型狀態機(1) Moore l型(2)…

前端框架中注釋占位與Fragment內容替換的實現與優化

在現代前端開發中&#xff0c;使用注釋占位符替換Fragment內容是一種常見的需求&#xff0c;尤其在處理動態內容、模板預加載和組件復用場景中。React和Vue作為當前最主流的前端框架&#xff0c;提供了不同的實現方式和優化策略&#xff0c;但核心目標都是減少不必要的DOM操作&…

uniapp中使用web-worker性能優化的分享

為什么要使用 web-workers原因很簡單&#xff0c;將復雜的計算邏輯和耗時邏輯放到線程中運行&#xff0c;避免ui阻塞&#xff0c;防止卡頓問題場景&#xff1a;本次運用于GPS 位置更新接入小程序注意事項&#xff1a;微信小程序中只允許存在一個 worker所以&#xff0c;需要再一…

5118 API智能處理采集數據教程

簡數采集器支持調用5118 API接口處理采集的數據標題和內容、關鍵詞、描述等&#xff0c;還可配合簡數采集的SEO功能優化文章數據&#xff0c;對提高收錄有積極的作用。 簡數采集器支持5118接口&#xff1a;5118智能核心詞提取API 和 5118智能摘要提取API 。 接入使用教程 1. …

【深度學習:進階篇】--4.2.詞嵌入和NLP

在RNN中詞使用one_hot表示的問題 假設有10000個詞 每個詞的向量長度都為10000&#xff0c;整體大小太大 沒能表示出詞與詞之間的關系 例如Apple與Orange會更近一些&#xff0c;Man與Woman會近一些&#xff0c;取任意兩個向量計算內積都為0 目錄 1.詞嵌入 1.1.特點 1.3.wor…

WebRTC 的 ICE candidate 協商

文章目錄 前言WebRTC 的 ICE candidate 協商1. 什么是 ICE candidate&#xff1f;2. ICE 協商的流程3.前端使用 ICE candidate 協商代碼示例1&#xff09;收集 candidate 并發送2&#xff09;WebSocket 接收 candidate 并添加 4. ICE candidate 的類型5. ICE 協商常見問題6. 關…

卡爾曼濾波介紹

卡爾曼濾波介紹&#x1f4d6; **卡爾曼濾波原理簡介**&#x1f511; **核心思想**&#x1f4e6; **卡爾曼濾波的組成**&#x1f50d; **代碼分析&#xff08;kalman_filter.py&#xff09;**&#x1f3d7;? 1. 狀態空間定義&#x1f504; 2. 初始化模型矩陣&#x1f680; 3. 核…

遞歸與循環

文章目錄遞歸TestRecursiveListRemoveNodeTestRecursiveListRemoveNode2循環TestWhileLoopListRemoveNodeTestWhileLoopListRemoveNode2遞歸 關鍵理解這幾點&#xff1a; 1、求解基本問題 2、將原問題拆分為小問題&#xff0c;直至基本問題&#xff08;難點&#xff09; 3、借…