LeetCode 資料流中的第K大元素(優先佇列)

2021-09-19 17:46:24 字數 2149 閱讀 8550

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

思路分析:首先我的思路是想著怎麼排序,每次都插入乙個元素,為此選擇插入排序,插入後再返回第k大元素。

class

kthlargest

it = mylist.

insert

(it, num);}

}int

add(

int val)

mylist.

insert

(it, val)

;//插入

//然後找到第k大元素

it = mylist.

begin()

;int tempk = k;

while

(tempk--

>1)

return

*it;}}

;/**

* your kthlargest object will be instantiated and called as such:

* kthlargest* obj = new kthlargest(k, nums);

* int param_1 = obj->add(val);

*/

這樣時間複雜度為o(n),空間複雜度為o(n)。

但是在乙個已經排好序的元素中插入的應該使用二分法,時間複雜度為o(log2n)。

class

kthlargest

}int

add(

int val)

return

*it;}}

;/**

* your kthlargest object will be instantiated and called as such:

* kthlargest* obj = new kthlargest(k, nums);

* int param_1 = obj->add(val);

*/

蛋式還是超時了。。

下面將維護乙個大小為k的公升序優先佇列,這隊首就是第k大元素。

class

kthlargest

//維持佇列的大小為k

while

(mypriorityque.

size()

> k)

}int

add(

int val)

}else

return mypriorityque.

top();

//當前隊首就是第k大元素}}

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加入堆中之後,仍然要維護堆的大小,其過程同上,最後將堆頂元素返回即可。...

LeetCode703 資料流中的第 K 大元素

設計乙個找到資料流中第 k 大元素的類 class 注意是排序後的第 k 大元素,不是第 k 個不同的元素。請實現 kthlargest 類 kthlargest int k,int nums 使用整數 k 和整數流 nums 初始化物件。int add int val 將 val 插入資料流 nu...