347 前 K 個高頻元素

2021-09-28 17:14:13 字數 1356 閱讀 8505

維護乙個size是k的堆。

求前k大的數,用小根堆

求前k小的數,用大根堆

求前k大,當堆的sizek時,去掉堆頂,最終堆中的資料就是最後的答案。

如陣列arr=,求最大的前3個數(一般來說求前k大/小,陣列中數是很大的,直接用排序,在選擇前k大/小的話,效率不高)。

首先建立堆,其size=0,一直push知道size=3時,此時小根堆的資料是[1, 7, 6],堆頂為1,陣列的下乙個數8,大於堆頂(如果小於堆頂則不進堆,因為堆中的所有元素都比其大),故push進堆裡,push(8),小根堆為[1, 7, 6, 8],此時堆的size=4>k=3,去掉對頂,去掉堆頂是用最後乙個數取代堆頂,再調整堆,所以此時的堆為[6, 7, 8],一直重複這樣的操作,知道遍歷完陣列,最後小根堆的資料為[8,13, 9]。輸出堆即可。

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

輸入:nums = [1,1,1,2,2,3], k = 2輸出:[1,2]
題目是求出現頻率前k高的元素,維護乙個size是k的小根堆,按照出現頻率來創堆。

可以自定義堆的排序,兩種方法,一是過載運算子"

using mypair = pair; //第乙個數存的是陣列中的值,第二個是出現頻率

class cmp //仿函式

};

對於此題,先用字典對儲存陣列中的數字出現的頻率,key值為陣列中的元素,value是key出現的頻率。再根據頻率來建立堆

#include#include#include#includeusing namespace std;

using mypair = pair;

class cmp //重寫仿函式

};class solution

} vectorres;

while (!minheap.empty())

return res;

}};int main()

; int k = 2;

for (auto i : soultion.topkfrequent(v, k))

cout << i << " ";

cout << endl;

system("pause");

return 0;

}

輸出:

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 個高頻元素

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

347 前 K 個高頻元素

給定乙個非空的整數陣列,返回其 現頻率前 k 高的元素。示例 1 示例 2 說明 你可以假設給定的 k 總是合理的,且 1 k 陣列中不相同的元素的個數。你的演算法的時間複雜度必須優於 o n log n n 是陣列的大小。首先使用雜湊表統計陣列元素的頻率,統計完成後,建立乙個二維陣列,將頻率作為陣...