703. 資料流中的第K大元素
阿新 • • 發佈:2018-12-12
703.資料流中的第K大元素
設計一個找到資料流中第K大元素的類(class)。注意是排序後的第K大元素,不是第K個不同的元素。
你的 KthLargest 類需要一個同時接收整數 k 和整數陣列nums 的構造器,它包含資料流中的初始元素。每次呼叫 KthLargest.add,返回當前資料流中第K大的元素。
示例:
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 說明:
分析: 用vector儲存k個最大的數,並從小到大排序,新增的數判斷是否大於vector中最開始的數,是則刪去這個數,並從後往前找這個數應該在的位置。
class KthLargest {
private:
vector<int> nnums;
int nk;
public:
KthLargest(int k, vector<int> nums) {
nk=k;
sort(nums.begin(),nums.end());
for(int i= 0;i<k&&i<nums.size();i++)
{
nnums.push_back(nums[nums.size()-1-i]);
}
sort(nnums.begin(),nnums.end());
}
int add(int val) {
if(nnums.size()<nk)
{
nnums.push_back(val);
sort(nnums.begin(),nnums.end ());
}
else
{
for(int i=nnums.size()-1;i>=0;i--)
{
if(val>nnums[i])
{
nnums.erase(nnums.begin());
nnums.insert(nnums.begin()+i,val);
break;
}
}
}
return nnums[0];
}
};
/**
* Your KthLargest object will be instantiated and called as such:
* KthLargest obj = new KthLargest(k, nums);
* int param_1 = obj.add(val);
*/