2.Kth Largest Element in a Stream
Design a class to find the kth largest element in a stream. Note that it is the kth largest element in the sorted order, not the kth distinct element.
Your KthLargest
class will have a constructor which accepts an integer k
and an integer array nums
, which contains initial elements from the stream. For each call to the method KthLargest.add
, return the element representing the kth largest element in the stream.
Example:
int k = 3;
int[] arr = [4,5,8,2];
KthLargest kthLargest = new KthLargest(3, arr);
kthLargest.add(3); // returns 4
kthLargest.add(5); // returns 5
kthLargest.add(10); // returns 5
kthLargest.add(9); // returns 8
kthLargest.add(4); // returns 8
Solution I: (Using a sorted array of size K)
Time Complexity: Insertion of new element : O(K) Finding the K largest will take O(1) Algo: If the new element is smaller ignore it. Else add in correct position by searching.
class KthLargest
{
public:
vector<int> v;
int count;
KthLargest(int k, vector<int> &nums)
{
sort(nums.begin(), nums.end());
int x = nums.size();
count = k;
if (x >= k)
{
int i = x - k;
while (i < nums.size())
{
v.push_back(nums[i]);
i++;
}
}
else
{
v = nums;
}
}
int add(int val)
{
if (v.size() > 0)
{
if (val > v[0] && v.size() == count)
{
v[0] = val;
for (int i = 0; i < v.size() - 1; i++)
{
if (v[i + 1] < v[i])
{
int temp = v[i];
v[i] = v[i + 1];
v[i + 1] = temp;
}
}
}
else if (v.size() < count)
{
v.push_back(val);
for (int i = 0; i < v.size() - 1; i++)
{
if (v[i + 1] < v[i])
{
int temp = v[i];
v[i] = v[i + 1];
v[i + 1] = temp;
}
}
}
}
else
{
v.push_back(val);
}
return v[0];
}
};
Solution II: (Using Min Heap)
class KthLargest
{
public:
priority_queue<int, vector<int>, greater<int>> pq;
int size;
KthLargest(int k, vector<int> &nums)
{
for (int i = 0; i < nums.size(); i++)
{
pq.push(nums[i]);
}
while (pq.size() > k)
{
pq.pop();
}
size = k;
}
int add(int val)
{
pq.push(val);
if (pq.size() > size)
{
pq.pop();
}
int res = pq.top();
return res;
}
};
Last updated
Was this helpful?