維護乙個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 是陣列的大小。首先使用雜湊表統計陣列元素的頻率,統計完成後,建立乙個二維陣列,將頻率作為陣...