どうも、たくチャレ(@takuchalle)です。
最初にk
と配列nums
が与えられ、add
関数の返り値としてk
番目に大きい値を返す問題。
優先順位付きキューpriority_queue
を使えば簡単に解くことができます。
優先順位付きキューを使い、昇順に並ぶようにし、キューの要素数をk
個に保つことでtop
を呼んだ時に常にk
番目に大きい値を取得できるようにしています。
コンストラクタの計算量はO(NlogN)
、add
メソッドの計算量はO(logN)
で、全体の使用メモリはO(N)
です。
class KthLargest {
private:
priority_queue<int, vector<int>, greater<int>> _q;
int _k;
public:
KthLargest(int k, vector<int>& nums) {
_k = k;
for (auto v : nums) {
_q.push(v);
if (_q.size() > _k) {
_q.pop(); // 一番小さい値を除く
}
}
}
int add(int val) {
_q.push(val);
if (_q.size() > _k) {
_q.pop();
}
return _q.top();
}
};