leetcode 703 資料流中第K大元素

2021-09-29 13:50:58 字數 1467 閱讀 7048

題目:

設計乙個找到資料流中第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

方法一:

維持乙個大小為k的有序陣列(從大到小)有幾種情況要考慮:

如果arr.size()如果arr.size()>=k:

1)後面進來的元素比nums[k-1]小,直接return nums[k-1]

2)後面進來得元素比nums[k-1]大,將陣列最後乙個數pop出去,然後將val放到陣列裡,並將排序後的陣列的最後乙個數作為返回值

**如下:但是有乙個k=9999的測試用例會超時

class

kthlargest

kthlargest

(int k, vector<

int>

& nums)

}int

add(

int val)

else}}

private

: vector<

int>tree;

int size_k;

};

方法二:

基本思想與方法一相同。不同的是,將陣列換成優先佇列

優先佇列的出隊順序是按照優先順序來的

支援插入和刪除最大/最小元素

一般用於找到元素集合中的最小或最大元素

**如下:

class

kthlargest

if(nums.

size()

>k)}}

intadd

(int val)

else}}

private

: priority_queue<

int,vector<

int>

,greater<

int>>tree;

//維護乙個小頂堆

int size_k;

};

LeetCode 703 資料流中的最k大元素

703 資料流中的最k大元素 題目 設計乙個找到資料流中第k大元素的類 class 注意是排序後的第k大元素,不是第k個不同的元素。你的 kthlargest 類需要乙個同時接收整數 k 和整數陣列nums 的構造器,它包含資料流中的初始元素。每次呼叫 kthlargest.add,返回當前資料流中...

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

設計乙個找到資料流中第k大元素的類 class 注意是排序後的第k大元素,不是第k個不同的元素。你的 kthlargest 類需要乙個同時接收整數 k 和整數陣列nums 的構造器,它包含資料流中的初始元素。每次呼叫 kthlargest.add,返回當前資料流中第k大的元素。示例 int k 3 ...

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

本題的解題過程如下,首先要明確題目的意思 本題目要求給定vector在放入最小堆之後第k大的元素,我們可以在新增元素的時候 也就是add函式 檢查隊中的元素格式是否大於k,一旦發現大於k那麼就將多餘的數字彈出,當我們將目標值val加入堆中之後,仍然要維護堆的大小,其過程同上,最後將堆頂元素返回即可。...