解法二:最小堆
ps:要求演算法的時間複雜度必須優於 o(n log n) , n 是陣列的大小。
最簡單粗暴的思路就是 使用排序演算法對元素按照頻率由高到低進行排序,然後再取前 kk 個元素。
以下十種排序演算法,任你挑選!
可以發現,使用常規的諸如 冒泡、選擇、甚至快速排序都是不滿足題目要求,它們的時間複雜度都是大於或者等於 o(n logn)o(nlogn),而題目要求演算法的時間複雜度必須優於 o(n log n)o(nlogn)。
時間複雜度:o(nlogn)o(nlogn),nn 表示陣列長度。首先,遍歷一遍陣列統計元素的頻率,這一系列操作的時間複雜度是 o(n)o(n);接著,排序演算法時間複雜度為 o(nlogn)o(nlogn);因此整體時間複雜度為 o(nlogn)o(nlogn)。
空間複雜度:o(n)o(n),最極端的情況下(每個元素都不同),用於儲存元素及其頻率的 map 需要儲存 nn 個鍵值對。
題目最終需要返回的是前 kk 個頻率最大的元素,可以想到借助堆這種資料結構,對於 kk 頻率之後的元素不用再去處理,進一步優化時間複雜度。
具體操作為:
借助 雜湊表 來建立數字和其出現次數的對映,遍歷一遍陣列統計元素的頻率
維護乙個元素數目為 kk 的最小堆
每次都將新的元素與堆頂元素(堆中頻率最小的元素)進行比較
如果新的元素的頻率比堆頂端的元素大,則彈出堆頂端的元素,將新的元素新增進堆中
最終,堆中的 kk 個元素即為前 kk 個高頻元素
class solution
priorityqueueheap=new priorityqueue((n1,n2)->
map.get(n1)-map.get(n2)
);for(int j:map.keyset())
}int result=new int[k];
for(int a=k-1;a>=0;a--)
return result;}}
leetcode刷題記錄
我覺得每天來兩道,練習練習,再看看人家是怎麼優化的。1.給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。c 暴力求解,204ms,9.1m class solution for index,num in enumerate ...
LeetCode刷題記錄
動態規劃和貪心演算法的異同點 class solution throw newruntimeexception 時間複雜度 o n 2 對於每個元素,我們試圖通過遍歷陣列的其餘部分來尋找它所對應的目標元素,這將耗費 o n o n 的時間。因此時間複雜度為 o n 2 需要一種方法,尋找符合要求的元...
leetcode刷題記錄
工作之餘刷刷題排解下寂寞 1 面試題66.構建乘積陣列 解題思路 題目要求可以簡化為求陣列中任意乙個元素左右兩邊所有元素的乘積。偷懶就用了乙個套路,練習了p c c python class solution def constructarr self,a list int list int 除法是...