1. 程式人生 > >703. 資料流中的第K大元素

703. 資料流中的第K大元素

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 說明:

你可以假設 nums 的長度≥ k-1 且k ≥ 1。

分析: 用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); */