leetcode 347 前 K 個高頻元素

2021-10-09 18:26:39 字數 1277 閱讀 3659

給定乙個非空的整數陣列,返回其**現頻率前 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 個高頻元素的集合是唯一的。

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

首先,需要使用map來建立元素與其頻率的對映關係,接下來就是怎麼去按照頻率對這些元素進行排序。

常見的排序方法的時間複雜度如下,這裡我們使用堆排序。

使用大小為k的小頂堆,則堆頂元素為擁有最小頻率的元素。

遍歷map,key為元素,value為其出現的次數

如果堆內元素個數小於k,則將此元素直接插入堆中

如果堆內元素等於k,則比較堆頂元素與新元素的出現次數。如果新元素的出現次數多,則先將堆頂元素出堆,再將新元素插入堆中。

最後,將堆中所有的元素直接存入結果陣列即可。

時間複雜度:因為需要遍歷map,時間複雜度為o(n)。且在每一次的遍歷中,元素在k容量的堆中比較的平均次數為logk,所以整個時間複雜度為o(nlogk)。k<=n,因此滿足題意。

空間複雜度:使用了乙個map,需要儲存最多n個entry。也使用了乙個堆,容量為k。所以,總的空間複雜度為o(n)。

**實現:

public int topkfrequent(int nums, int k) 

//構造小頂堆

queuequeue = new priorityqueue<>(new comparator()

});for (map.entryentry : map.entryset()) else }}

int result = new int[k];

int index = 0;

while (!queue.isempty())

return result;

}

提交答案:

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