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과 같으면 -
-
sts에서 maxKey 삭제
-
(maxFreq를 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