chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何解決數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)最大頻率棧問(wèn)題?

算法與數(shù)據(jù)結(jié)構(gòu) ? 來(lái)源:labuladong ? 作者:labuladong ? 2021-03-02 11:02 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

讀完本文,可以去力扣解決如下題目:

895.最大頻率棧(Hard)

我個(gè)人很喜歡設(shè)計(jì)特殊數(shù)據(jù)結(jié)構(gòu)的問(wèn)題,畢竟在工作中會(huì)經(jīng)常用到基本數(shù)據(jù)結(jié)構(gòu),而設(shè)計(jì)類的問(wèn)題就非??简?yàn)對(duì)基本數(shù)據(jù)結(jié)構(gòu)的理解和運(yùn)用。

力扣第 895 題要求我們實(shí)現(xiàn)一個(gè)特殊的數(shù)據(jù)結(jié)構(gòu)「最大頻率?!?,比較有意思,讓我們實(shí)現(xiàn)下面這兩個(gè) API

class FreqStack {

// 在棧中加入一個(gè)元素 val

public void push(int val) {}

// 從棧中刪除并返回出現(xiàn)頻率最高的元素

// 如果頻率最高的元素不止一個(gè),

// 則返回最近添加的那個(gè)元素

public int pop() {}

}

比如下面這個(gè)例子:

FreqStack stk = new FreqStack();

// 向最大頻率棧中添加元素

stk.push(2); stk.push(7); stk.push(2);

stk.push(7); stk.push(2); stk.push(4);

// 棧中元素:[2,7,2,7,2,4]

stk.pop() // 返回 2

// 因?yàn)?2 出現(xiàn)了三次

// 棧中元素:[2,7,2,7,4]

stk.pop() // 返回 7

// 2 和 7 都出現(xiàn)了兩次,但 7 是最近添加的

// 棧中元素:[2,7,2,4]

stk.pop() // 返回 2

// 棧中元素:[2,7,4]

stk.pop() // 返回 4

// 棧中元素:[2,7]

這種設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)的問(wèn)題,主要是要搞清楚問(wèn)題的難點(diǎn)在哪里,然后結(jié)合各種基本數(shù)據(jù)結(jié)構(gòu)的特性,高效實(shí)現(xiàn)題目要求的 API。

那么,我們仔細(xì)思考一下 push 和 pop 方法,難點(diǎn)如下:

1、每次 pop 時(shí),必須要知道頻率最高的元素是什么。

2、如果頻率最高的元素有多個(gè),還得知道哪個(gè)是最近 push 進(jìn)來(lái)的元素是哪個(gè)。

為了實(shí)現(xiàn)上述難點(diǎn),我們要做到以下幾點(diǎn):

1、肯定要有一個(gè)變量 maxFreq 記錄當(dāng)前棧中最高的頻率是多少。

2、我們得知道一個(gè)頻率 freq 對(duì)應(yīng)的元素有哪些,且這些元素要有時(shí)間順序。

3、隨著 pop 的調(diào)用,每個(gè) val 對(duì)應(yīng)的頻率會(huì)變化,所以還得維持一個(gè)映射記錄每個(gè) val 對(duì)應(yīng)的 freq。

綜上,我們可以先實(shí)現(xiàn) FreqStack 所需的數(shù)據(jù)結(jié)構(gòu):

class FreqStack {

// 記錄 FreqStack 中元素的最大頻率

int maxFreq = 0;

// 記錄 FreqStack 中每個(gè) val 對(duì)應(yīng)的出現(xiàn)頻率,后文就稱為 VF 表

HashMap《Integer, Integer》 valToFreq = new HashMap《》();

// 記錄頻率 freq 對(duì)應(yīng)的 val 列表,后文就稱為 FV 表

HashMap《Integer, Stack《Integer》》 freqToVals = new HashMap《》();

}

其實(shí)這有點(diǎn)類似前文 手把手實(shí)現(xiàn) LFU 算法,注意 freqToVals 中 val 列表用一個(gè)棧實(shí)現(xiàn),如果一個(gè) freq 對(duì)應(yīng)的元素有多個(gè),根據(jù)棧的特點(diǎn),可以首先取出最近添加的元素。

要記住在 push 和 pop 方法中同時(shí)修改 maxFreq、VF 表、FV 表,否則容易出現(xiàn) bug。

現(xiàn)在,我們可以來(lái)實(shí)現(xiàn) push 方法了:

public void push(int val) {

// 修改 VF 表:val 對(duì)應(yīng)的 freq 加一

int freq = valToFreq.getOrDefault(val, 0) + 1;

valToFreq.put(val, freq);

// 修改 FV 表:在 freq 對(duì)應(yīng)的列表加上 val

freqToVals.putIfAbsent(freq, new Stack《》());

freqToVals.get(freq).push(val);

// 更新 maxFreq

maxFreq = Math.max(maxFreq, freq);

}

pop 方法的實(shí)現(xiàn)也非常簡(jiǎn)單:

public int pop() {

// 修改 FV 表:pop 出一個(gè) maxFreq 對(duì)應(yīng)的元素 v

Stack《Integer》 vals = freqToVals.get(maxFreq);

int v = vals.pop();

// 修改 VF 表:v 對(duì)應(yīng)的 freq 減一

int freq = valToFreq.get(v) - 1;

valToFreq.put(v, freq);

// 更新 maxFreq

if (vals.isEmpty()) {

// 如果 maxFreq 對(duì)應(yīng)的元素空了

maxFreq--;

}

return v;

}

這樣,兩個(gè) API 都實(shí)現(xiàn)了,算法執(zhí)行過(guò)程如下:

嗯,這道題就解決了,Hard 難度的題目也不過(guò)如此嘛~

原文標(biāo)題:數(shù)據(jù)結(jié)構(gòu)基本功:設(shè)計(jì)最大頻率棧

文章出處:【微信公眾號(hào):算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7347

    瀏覽量

    94999
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    2466

    瀏覽量

    66988

原文標(biāo)題:數(shù)據(jù)結(jié)構(gòu)基本功:設(shè)計(jì)最大頻率棧

文章出處:【微信號(hào):TheAlgorithm,微信公眾號(hào):算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    OCAD應(yīng)用:打入式斷續(xù)變焦光學(xué)系統(tǒng)初始結(jié)構(gòu)設(shè)計(jì)

    。完成之后,再按“下一步”,可以完成整個(gè)系統(tǒng)的初始結(jié)構(gòu)設(shè)計(jì)。 圖6.會(huì)聚光路中打入式自動(dòng)設(shè)計(jì)結(jié)構(gòu)示意圖 系統(tǒng)的初始結(jié)構(gòu)設(shè)計(jì)數(shù)據(jù)如下。 圖7.會(huì)聚光路中打入式自動(dòng)設(shè)計(jì)結(jié)構(gòu)系統(tǒng)
    發(fā)表于 04-10 08:18

    復(fù)合機(jī)器人機(jī)械結(jié)構(gòu)設(shè)計(jì)與創(chuàng)新:智能制造的前沿技術(shù)與發(fā)展趨勢(shì)

    :復(fù)合機(jī)器人機(jī)械結(jié)構(gòu)設(shè)計(jì)的核心技術(shù) 1.1 多自由度設(shè)計(jì)與靈活性提升 多自由度(DOF)設(shè)計(jì)是復(fù)合機(jī)器人機(jī)械結(jié)構(gòu)中最為關(guān)鍵的技術(shù)之一。通過(guò)增加機(jī)械臂或機(jī)器人的自由度,復(fù)合機(jī)器人能夠執(zhí)行更復(fù)雜的操作,提供更高的精度和靈活性
    的頭像 發(fā)表于 02-05 15:13 ?205次閱讀
    復(fù)合機(jī)器人機(jī)械<b class='flag-5'>結(jié)構(gòu)設(shè)計(jì)</b>與創(chuàng)新:智能制造的前沿技術(shù)與發(fā)展趨勢(shì)

    ePTFE防水透氣膜與塑料零件焊接的結(jié)構(gòu)設(shè)計(jì)指南

    ePTFE(膨體聚四氟乙烯)防水透氣膜與塑料零件焊接時(shí)的結(jié)構(gòu)設(shè)計(jì)問(wèn)題。一般采用熱熔焊接和超聲波焊接兩種工藝,而超聲波焊接往往需要設(shè)計(jì)特殊的焊接結(jié)構(gòu),這是一個(gè)非常專業(yè)且關(guān)鍵的工藝環(huán)節(jié),直接決定了產(chǎn)品
    的頭像 發(fā)表于 01-20 11:44 ?594次閱讀
    ePTFE防水透氣膜與塑料零件焊接的<b class='flag-5'>結(jié)構(gòu)設(shè)計(jì)</b>指南

    知識(shí)分享:產(chǎn)品的結(jié)構(gòu)構(gòu)架與EMC

    知識(shí)分享:產(chǎn)品的結(jié)構(gòu)構(gòu)架與EMC結(jié)構(gòu)是產(chǎn)品的重要組成部分,結(jié)構(gòu)不能單獨(dú)成為EMC問(wèn)題的來(lái)源,但卻是解決EMC問(wèn)題的重要途徑。電磁場(chǎng)屏蔽、良好的接地系統(tǒng)以及耦合的避免都要借助于良好的結(jié)構(gòu)設(shè)計(jì)
    的頭像 發(fā)表于 01-19 17:07 ?2215次閱讀
    知識(shí)分享:產(chǎn)品的<b class='flag-5'>結(jié)構(gòu)</b>構(gòu)架與EMC

    半導(dǎo)體封裝框架的外部結(jié)構(gòu)設(shè)計(jì)

    封裝框架的外部結(jié)構(gòu)設(shè)計(jì),核心包含聯(lián)筋(Dambar)與假腳(False leads)兩大關(guān)鍵部分,以下將針對(duì)各設(shè)計(jì)要素及技術(shù)要求展開詳細(xì)說(shuō)明。
    的頭像 發(fā)表于 12-26 15:03 ?879次閱讀
    半導(dǎo)體封裝框架的外部<b class='flag-5'>結(jié)構(gòu)設(shè)計(jì)</b>

    堆和的區(qū)別

    一個(gè)由C/C 編譯的程序占用的內(nèi)存分為以下幾個(gè)部分: 區(qū)(stack):由編譯器自動(dòng)分配釋放 ,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的。 堆區(qū)(heap):一般由
    的頭像 發(fā)表于 11-27 18:13 ?1216次閱讀

    改進(jìn)型乘法器結(jié)構(gòu)設(shè)計(jì)

    位,乘數(shù)的符號(hào)擴(kuò)展位為0,MUL和 MULH指令的兩個(gè)操作數(shù)的符號(hào)擴(kuò)展位分別為被乘數(shù)和乘數(shù)的最高位。MUL指令選取Wallace樹形結(jié)構(gòu)壓縮結(jié)果的低32位,其余乘法指令選取Wallace樹形結(jié)構(gòu)壓縮結(jié)果
    發(fā)表于 10-22 07:51

    解析GaN-MOSFET的結(jié)構(gòu)設(shè)計(jì)

    GaN-MOSFET 的結(jié)構(gòu)設(shè)計(jì)中,p-GaN gate(p 型氮化鎵柵) 和Cascode(共源共柵) 是兩種主流的柵極控制方案,分別適用于不同的應(yīng)用場(chǎng)景,核心差異體現(xiàn)在結(jié)構(gòu)設(shè)計(jì)、性能特點(diǎn)和適用范圍上。
    的頭像 發(fā)表于 10-14 15:28 ?1200次閱讀
    解析GaN-MOSFET的<b class='flag-5'>結(jié)構(gòu)設(shè)計(jì)</b>

    自主創(chuàng)新賦能半導(dǎo)體封裝產(chǎn)業(yè)——江蘇拓能半導(dǎo)體科技有限公司與 “半導(dǎo)體封裝結(jié)構(gòu)設(shè)計(jì)軟件” 的突破之路

    的性能、可靠性與成本,而封裝結(jié)構(gòu)設(shè)計(jì)作為封裝技術(shù)落地的 “第一道關(guān)卡”,對(duì)設(shè)計(jì)軟件的依賴性極強(qiáng)。在此背景下,江蘇拓能半導(dǎo)體科技有限公司(以下簡(jiǎn)稱 “江蘇拓能”)自主研發(fā)的 “半導(dǎo)體封裝結(jié)構(gòu)設(shè)計(jì)軟件 V1.0”(簡(jiǎn)稱:半
    的頭像 發(fā)表于 09-11 11:06 ?1214次閱讀
    自主創(chuàng)新賦能半導(dǎo)體封裝產(chǎn)業(yè)——江蘇拓能半導(dǎo)體科技有限公司與 “半導(dǎo)體封裝<b class='flag-5'>結(jié)構(gòu)設(shè)計(jì)</b>軟件” 的突破之路

    【HZ-T536開發(fā)板免費(fèi)體驗(yàn)】6、使用protoc-gen-gorm生成標(biāo)準(zhǔn)化的數(shù)據(jù)結(jié)構(gòu)

    在設(shè)計(jì)espnow協(xié)議的時(shí)候,考慮到我需要在esp32,Linux設(shè)備,web上使用相同的數(shù)據(jù)結(jié)構(gòu),那就需要考慮一下,是否使用一個(gè)通用的跨平臺(tái)序列化數(shù)據(jù)結(jié)構(gòu)。這時(shí)候我想起了protobuf,這個(gè)就是
    發(fā)表于 08-26 00:32

    冠坤臺(tái)系電容:憑獨(dú)特卷繞結(jié)構(gòu)設(shè)計(jì),成為車規(guī)空間內(nèi)能量?jī)?chǔ)備的 “擴(kuò)容專家”

    獨(dú)特的臺(tái)系電容技術(shù),尤其是創(chuàng)新的卷繞結(jié)構(gòu)設(shè)計(jì),成功在車規(guī)空間內(nèi)實(shí)現(xiàn)了能量?jī)?chǔ)備的"擴(kuò)容",成為行業(yè)內(nèi)的佼佼者。 冠坤電子的核心技術(shù)優(yōu)勢(shì)在于其獨(dú)特的卷繞結(jié)構(gòu)設(shè)計(jì)。傳統(tǒng)的電容器采用簡(jiǎn)單的層疊或卷繞方式,容易受到空間限制,難以在
    的頭像 發(fā)表于 08-05 17:07 ?840次閱讀

    PCB層疊結(jié)構(gòu)設(shè)計(jì)的先決條件

    )出發(fā),深入探討PCB多層板的層疊結(jié)構(gòu)設(shè)計(jì)的先決條件。 一、Core和PP的簡(jiǎn)要介紹 Core是PCB多層板的核心組成部分,它的兩個(gè)表層都鋪有銅箔,可作為信號(hào)層、電源層、地層等導(dǎo)電層。Core的上、下表層之間填充的是固態(tài)材料,具有良好的機(jī)械強(qiáng)度和電氣性能。而PP則是一種半固態(tài)的樹脂
    的頭像 發(fā)表于 06-06 15:37 ?1506次閱讀
    PCB層疊<b class='flag-5'>結(jié)構(gòu)設(shè)計(jì)</b>的先決條件

    微孔霧化設(shè)備結(jié)構(gòu)設(shè)計(jì)要點(diǎn) – 陶瓷片固定&amp;受力分析

    在微孔霧化驅(qū)動(dòng)集成芯片的推廣實(shí)踐中,我們發(fā)現(xiàn)除了硬件和軟件的迭代升級(jí),結(jié)構(gòu)設(shè)計(jì)方面有一個(gè)值得顯著關(guān)注的點(diǎn):微孔設(shè)備的霧化性能(頻率,霧化量和功耗)會(huì)受到陶瓷片表面壓力的直接影響。我們強(qiáng)烈建議,在初步
    的頭像 發(fā)表于 05-29 10:42 ?1349次閱讀
    微孔霧化設(shè)備<b class='flag-5'>結(jié)構(gòu)設(shè)計(jì)</b>要點(diǎn) – 陶瓷片固定&amp;受力分析

    OCAD應(yīng)用:菲涅爾透鏡初始結(jié)構(gòu)設(shè)計(jì)

    像系統(tǒng),特別是照明系統(tǒng)更為常見。這類系統(tǒng)往往只需要一個(gè)單片透鏡,工藝簡(jiǎn)單可以模壓成形。在對(duì)該類透鏡初始結(jié)構(gòu)設(shè)計(jì)時(shí)利用 OCAD 程序也非常簡(jiǎn)單。只要在數(shù)據(jù)表格中的“表面面型”欄內(nèi)選擇“菲涅爾面”,接著
    發(fā)表于 05-19 08:49

    程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)

    《程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)》重點(diǎn)闡述了三大方向內(nèi)容: 1. C語(yǔ)言學(xué)習(xí)中的痛點(diǎn):針對(duì)當(dāng)前工程師在C語(yǔ)言學(xué)習(xí)中的痛點(diǎn),如指針函數(shù)與函數(shù)指針,如何靈活應(yīng)用結(jié)構(gòu)體等。從變量的三要素(變量的類型,變量的值和變量
    發(fā)表于 05-13 16:45