一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

895.最大頻率棧(Hard)

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

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

class FreqStack {

// 在棧中加入一個元素 val

public void push(int val) {}

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

// 如果頻率最高的元素不止一個,

// 則返回最近添加的那個元素

public int pop() {}

}

比如下面這個例子:

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

// 因為 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è)計數(shù)據(jù)結(jié)構(gòu)的問題,主要是要搞清楚問題的難點在哪里,然后結(jié)合各種基本數(shù)據(jù)結(jié)構(gòu)的特性,高效實現(xiàn)題目要求的 API。

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

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

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

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

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

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

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

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

class FreqStack {

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

int maxFreq = 0;

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

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

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

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

}

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

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

現(xiàn)在,我們可以來實現(xiàn) push 方法了:

public void push(int val) {

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

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

valToFreq.put(val, freq);

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

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

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

// 更新 maxFreq

maxFreq = Math.max(maxFreq, freq);

}

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

public int pop() {

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

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

int v = vals.pop();

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

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

valToFreq.put(v, freq);

// 更新 maxFreq

if (vals.isEmpty()) {

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

maxFreq--;

}

return v;

}

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

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

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

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

責(zé)任編輯:haq

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

    關(guān)注

    8

    文章

    7256

    瀏覽量

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

    關(guān)注

    2

    文章

    1620

    瀏覽量

    64048

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

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

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

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

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

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

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

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

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

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

    電子設(shè)備結(jié)構(gòu)設(shè)計中的電源模塊EMC細(xì)節(jié)深度剖析

    、電源屏蔽、EMI 耦合、開關(guān)電源模塊外圍電路的EMC與防護(hù)設(shè)計等方面的細(xì)節(jié),有助于電子設(shè)備結(jié)構(gòu)設(shè)計效果優(yōu)化。 ? 1 開關(guān)電源 開關(guān)電源引起電磁干擾問題的原因是很復(fù)雜的。針對開關(guān)電源的EMC 問題,在設(shè)計時應(yīng)采用以下主要措施: 1.1 軟開關(guān)
    的頭像 發(fā)表于 02-17 10:20 ?4330次閱讀

    BP神經(jīng)網(wǎng)絡(luò)的網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計原則

    BP(back propagation)神經(jīng)網(wǎng)絡(luò)是一種按照誤差逆向傳播算法訓(xùn)練的多層前饋神經(jīng)網(wǎng)絡(luò),其網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計原則主要基于以下幾個方面: 一、層次結(jié)構(gòu) 輸入層 :接收外部輸入信號,不進(jìn)行任何計算
    的頭像 發(fā)表于 02-12 16:41 ?743次閱讀

    鑒相器和電荷泵的結(jié)構(gòu)設(shè)計及優(yōu)化

    鑒相器+電荷泵(PFD+CP)是鎖相環(huán)內(nèi)部的重要結(jié)構(gòu),在通信系統(tǒng)、頻率合成以及時鐘信號生成中有著廣泛的應(yīng)用。鑒相器用于檢測兩個輸入信號的相位差,電荷泵把鑒相器輸出的相位差轉(zhuǎn)換成電荷輸送給濾波器,用于給后續(xù)的震蕩器提供控制電壓。本文將對鑒相器和電荷泵
    的頭像 發(fā)表于 01-02 09:39 ?2900次閱讀
    鑒相器和電荷泵的<b class='flag-5'>結(jié)構(gòu)設(shè)計</b>及優(yōu)化

    DDC264配置寄存器數(shù)據(jù)寫入和320 DCLK時鐘脈沖后的回讀數(shù)據(jù)結(jié)構(gòu)是什么?

    配置寄存器數(shù)據(jù)寫入和320 DCLK時鐘脈沖后的回讀數(shù)據(jù)結(jié)構(gòu)是什么? 根據(jù)注和表9,16位配置寄存器數(shù)據(jù),4位修訂ID, 300位校驗?zāi)J?,怎么可能?024 TOTAL READBACK BITS, format = 0
    發(fā)表于 11-19 07:58

    視覺軟件HALCON的數(shù)據(jù)結(jié)構(gòu)

    在研究機器視覺算法之前,我們需要先了解機器視覺應(yīng)用中涉及的基本數(shù)據(jù)結(jié)構(gòu)。Halcon數(shù)據(jù)結(jié)構(gòu)主要有圖像參數(shù)和控制參數(shù)兩類參數(shù)。圖像參數(shù)包括:image、region、XLD,控制參數(shù)包括:string、integer、real、handle、tuple數(shù)組等。
    的頭像 發(fā)表于 11-14 10:20 ?1293次閱讀
    視覺軟件HALCON的<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>

    HDI的疊層結(jié)構(gòu)設(shè)計

    在現(xiàn)代電子制造領(lǐng)域,高密度互連(HDI)技術(shù)已成為推動電子產(chǎn)品向更小型化、更高性能發(fā)展的關(guān)鍵因素。HDI技術(shù)的核心在于其獨特的疊構(gòu)設(shè)計,這不僅極大地提升了電路板的空間利用率,還顯著增強了電氣性能和信號完整性。
    的頭像 發(fā)表于 10-28 14:18 ?1382次閱讀
    HDI的疊層<b class='flag-5'>結(jié)構(gòu)設(shè)計</b>

    永磁發(fā)電機的主要結(jié)構(gòu)設(shè)計是什么?

    永磁發(fā)電機是一種利用永磁體產(chǎn)生磁場的發(fā)電機,它具有結(jié)構(gòu)簡單、體積小、重量輕、效率高、維護(hù)方便等優(yōu)點。永磁發(fā)電機的主要結(jié)構(gòu)設(shè)計包括以下幾個方面: 定子部分 定子是發(fā)電機的核心部件之一,它主要由定子鐵芯
    的頭像 發(fā)表于 10-25 10:40 ?955次閱讀

    架構(gòu)師日記-從數(shù)據(jù)庫發(fā)展歷程到數(shù)據(jù)結(jié)構(gòu)設(shè)計探析

    數(shù)據(jù)庫發(fā)展史 起初,數(shù)據(jù)的管理方式是文件系統(tǒng),數(shù)據(jù)存儲在文件中,數(shù)據(jù)管理和維護(hù)都由程序員完成。后來發(fā)展出樹形結(jié)構(gòu)和網(wǎng)狀
    的頭像 發(fā)表于 09-25 11:20 ?1162次閱讀
    架構(gòu)師日記-從<b class='flag-5'>數(shù)據(jù)</b>庫發(fā)展歷程到<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)設(shè)計</b>探析

    嵌入式常用數(shù)據(jù)結(jié)構(gòu)有哪些

    在嵌入式編程中,數(shù)據(jù)結(jié)構(gòu)的選擇和使用對于程序的性能、內(nèi)存管理以及開發(fā)效率都具有重要影響。嵌入式系統(tǒng)由于資源受限(如處理器速度、內(nèi)存大小等),因此對數(shù)據(jù)結(jié)構(gòu)的選擇和使用尤為關(guān)鍵。以下是嵌入式編程中常用的幾種數(shù)據(jù)結(jié)構(gòu),結(jié)合具體特點和
    的頭像 發(fā)表于 09-02 15:25 ?1040次閱讀

    EMC(電磁兼容性)結(jié)構(gòu)設(shè)計基礎(chǔ)

    介紹了電磁兼容的基本定義,要求,結(jié)構(gòu)設(shè)計的準(zhǔn)則和方法。
    發(fā)表于 08-08 14:23 ?13次下載

    5針M16接口結(jié)構(gòu)設(shè)計

    德索工程師說道5針M16接口的結(jié)構(gòu)設(shè)計是一個綜合性的過程,它融合了電氣、機械、材料科學(xué)等多個領(lǐng)域的知識,旨在提供高效、穩(wěn)定且可靠的電氣連接。以下是對5針M16接口結(jié)構(gòu)設(shè)計的詳細(xì)解析:   5針
    的頭像 發(fā)表于 08-03 09:38 ?911次閱讀
    5針M16接口<b class='flag-5'>結(jié)構(gòu)設(shè)計</b>