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(nlogn),不滿足題目的要求。
在這裡,我們可以利用堆的思想:建立乙個小頂堆,然後遍歷「出現次數陣列」:
如果堆的元素個數小於 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 ...