สมมติว่าเราต้องการใช้หนึ่งสแต็คที่เรียกว่า FreqStack FreqStack ของเรามีสองหน้าที่ -
-
push(x) สิ่งนี้จะผลักจำนวนเต็ม x ลงบนสแต็ก
-
pop() สิ่งนี้จะลบและส่งคืนองค์ประกอบที่บ่อยที่สุดในสแต็ก หากมีองค์ประกอบมากกว่าหนึ่งรายการที่มีความถี่เท่ากัน องค์ประกอบที่ใกล้กับด้านบนของสแต็กที่สุดจะถูกลบออกและส่งคืน
ดังนั้น หากอินพุตเป็นเหมือนผลักองค์ประกอบบางอย่าง เช่น 7, 9, 7, 9, 6, 7 จากนั้นดำเนินการป๊อปอัปสี่ครั้ง ผลลัพธ์จะเป็น 7,9,7,6 ตามลำดับ
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดหนึ่งแผนที่ cnt
-
กำหนดหนึ่ง sts แผนที่
-
maxFreq :=0
-
กำหนดฟังก์ชัน push() ซึ่งจะใช้เวลา x
-
(เพิ่ม cnt[x] ขึ้น 1)
-
maxFreq :=สูงสุดของ maxFreq และ cnt[x]
-
แทรก x ลงใน sts[cnt[x]]
-
กำหนดฟังก์ชัน pop()
-
maxKey :=maxFreq
-
x :=องค์ประกอบด้านบนของ sts[maxKey]
-
ลบองค์ประกอบออกจาก sts[maxKey]
-
ถ้าขนาดของ sts[maxKey] เท่ากับ 0 แล้ว −
-
ลบ maxKey ออกจาก sts
-
(ลดความถี่สูงสุดลง 1)
-
-
(ลด cnt[x] ลง 1)
-
ผลตอบแทน x
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; class FreqStack { public: unordered_map <int ,int > cnt; unordered_map <int, stack <int> >sts; int maxFreq = 0; FreqStack() { maxFreq = 0; cnt.clear(); sts.clear(); } void push(int x) { cnt[x]++; maxFreq = max(maxFreq, cnt[x]); sts[cnt[x]].push(x); } int pop() { int maxKey = maxFreq; int x = sts[maxKey].top(); sts[maxKey].pop(); if(sts[maxKey].size() == 0){ sts.erase(maxKey); maxFreq--; } cnt[x]--; return x; } }; main(){ FreqStack ob; ob.push(7); ob.push(9); ob.push(7); ob.push(9); ob.push(6); ob.push(7); cout << (ob.pop()) << endl; cout << (ob.pop()) << endl; cout << (ob.pop()) << endl; cout << (ob.pop()) << endl; }
อินพุต
push elements 7, 9, 7, 9, 6, 7, then call pop() four times.
ผลลัพธ์
7 9 7 6