leetcode 347 前 K 個高頻元素

2021-10-22 07:33:10 字數 1273 閱讀 4251

347. 前 k 個高頻元素

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

示例 1:

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

輸出: [1,2]

示例 2:

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

輸出: [1]

方法一:使用priorityqueue模擬小頂堆

思路與演算法

首先遍歷整個陣列,並使用雜湊表記錄每個數字出現的次數,並形成乙個「出現次數陣列」。找出原陣列的前 k 個高頻元素,就相當於找出「出現次數陣列」的前 k 大的值。

最簡單的做法是給「出現次數陣列」排序。但由於可能有 o(n)個不同的出現次數(其中 n 為原陣列長度),故總的演算法複雜度會達到 o(nlog⁡n),不滿足題目的要求。

在這裡,我們可以利用堆的思想:建立乙個小頂堆,然後遍歷「出現次數陣列」:

如果堆的元素個數小於 k,就可以直接插入堆中。

如果堆的元素個數等於 k,則檢查堆頂與當前出現次數的大小。如果堆頂更大,說明至少有 k 個數字的出現次數比當前值大,故捨棄當前值;否則,就彈出堆頂,並將當前值插入堆中。

遍歷完成後,堆中的元素就代表了「出現次數陣列」中前 k 大的值。

**

class

solution

// int 的第乙個元素代表陣列的值,第二個元素代表了該值出現的次數

priorityqueue<

int[

]> queue =

newpriorityqueue

<

int[

]>

(new

comparator

<

int[

]>()

});for

(map.entry

entry : occurrences.

entryset()

));}

}else);

}}int[

] ret =

newint

[k];

//此時佇列中的所有元素即時出現次數前k的,其中越前面越小

for(

int i =

0; i < k;

++i)

return ret;

}}

Leetcode 347 前K個高頻元素

給定乙個非空的整數陣列,返回其 現頻率前k高的元素。示例 1 輸入 nums 1,1,1,2,2,3 k 2 輸出 1,2 示例 2 輸入 nums 1 k 1 輸出 1 說明 首先都要先用hash表統計一次頻率,乙個思路是排序,取前k個元素 第二個思路是使用優先佇列,這裡提供兩種 class so...

Leetcode347 前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...

leetcode 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 ...