347 前 K 個高頻元素

2021-10-22 20:28:19 字數 1232 閱讀 7050

給定乙個非空的整數陣列,返回其**現頻率前 k 高的元素。

示例 1:

輸入: nums = [1,1,1,2,2,3], k = 2

輸出: [1,2]

示例 2:

輸入: nums = [1], k = 1

輸出: [1]

你可以假設給定的 k 總是合理的,且 1 ≤ k ≤ 陣列中不相同的元素的個數。

你的演算法的時間複雜度必須優於 o(n log n) , n 是陣列的大小。

題目資料保證答案唯一,換句話說,陣列中前 k 個高頻元素的集合是唯一的。

你可以按任意順序返回答案。

1.大根堆和小根堆建立優先佇列都可以,但在建立之前我們要有乙個出現次數的陣列,將這個陣列放入佇列。這邊我們使用hashmap統計元素的次數,最後放入佇列的是乙個int,int[0]是nums中的元素,int[1]是該元素出現的次數

2.小根堆的話可以限制佇列的元素個數,即題目要求的k個

3.如果要建立大根堆,就需要把hashmap中的所有元素都放入佇列,最後取前k個返回,也就不需要size變數控制佇列中的元素個數。因為大根堆中堆頂的元素是我們需要的,不能出佇列,而小根堆中的堆頂元素(隊頭元素)是佇列中最小的,當遇見更大的時候可以拋棄

4.下面以小根堆為例

class

solution

priorityqueue<

int[

]> pq =

newpriorityqueue

<

>

(new

comparator

<

int[

]>()

});int size =0;

int[

]res =

newint

[k];

for(map.entry entry : map.

entryset()

));*/

if(size < k)pq.

offer

(new

int)

;else);

}}size++;}

for(

int i =

0; i < k; i++

)return res;

// iterator iter = map.entryset().iterator();

// while(iter.hasnext())

}}

347 前K個高頻元素

給定乙個非空的整數陣列,返回其 現頻率前 k 高的元素。示例 1 輸入 nums 1,1,1,2,2,3 k 2 輸出 1,2 示例 2 輸入 nums 1 k 1 輸出 1 說明 你可以假設給定的 k 總是合理的,且 1 k 陣列中不相同的元素的個數。你的演算法的時間複雜度必須優於 o n log...

347 前 K 個高頻元素

維護乙個size是k的堆。求前k大的數,用小根堆 求前k小的數,用大根堆 求前k大,當堆的sizek時,去掉堆頂,最終堆中的資料就是最後的答案。如陣列arr 求最大的前3個數 一般來說求前k大 小,陣列中數是很大的,直接用排序,在選擇前k大 小的話,效率不高 首先建立堆,其size 0,一直push...

347 前 K 個高頻元素

方法很好想,要麼暴力排序,歸併,堆排都能滿足o nlogn 的要求。我第一次想到的就是,用雜湊統計一下數字,然後過載排一下序,順序放入集合裡就行。這次用的是最小堆,主要學習一下priorityqueue,是基於優先順序堆的無界優先順序queue modifier and type method an...