日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

前K个高频元素(top k)(TX)

發布時間:2024/4/18 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 前K个高频元素(top k)(TX) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

思路

這道題目主要涉及到如下三塊內容:
1、要統計元素出現頻率
2、對頻率排序
3、找出前K個高頻元素

首先統計元素出現的頻率,這一類的問題可以使用map來進行統計。

然后是對頻率進行排序,這里我們可以使用一種 容器適配器就是「優先級隊列」

為什么不用快排呢, 使用快排要將map轉換為vector的結構,然后對整個數組進行排序, 而這種場景下,我們其實只需要維護k個有序的序列就可以了,所以使用優先級隊列是最優的。

此時要思考一下,是使用小頂堆呢,還是大頂堆?

有的同學一想,題目要求前 K 個高頻元素,那么果斷用大頂堆啊。

那么問題來了,定義一個大小為k的大頂堆,在每次移動更新大頂堆的時候,每次彈出都把最大的元素彈出去了,那么怎么保留下來前K個高頻元素呢。

所以我們要用小頂堆,因為要統計最大前k個元素,只有小頂堆每次將最小的元素彈出,最后小頂堆里積累的才是前k個最大元素。

尋找前k個最大元素流程如圖所示:(圖中的頻率只有三個,所以正好構成一個大小為3的小頂堆,如果頻率更多一些,則用這個小頂堆進行掃描)

// 時間復雜度:O(nlogk) // 空間復雜度:O(n) class Solution { public://自定義比較函數class mycompare{public:bool operator()(const pair<int,int>& lhs,const pair<int,int>& rhs){return lhs.second>rhs.second;//由小到大排列,小頂堆}};vector<int> topKFrequent(vector<int>& nums, int k) {vector<int> res(k);// 1、統計每個元素出現的頻率unordered_map<int,int> map;// map<nums[i],對應出現的次數>for(int ii=0;ii<nums.size();ii++){map[nums[ii]]++;}// 2、對頻率排序// 定義一個優先級隊列,維護小頂堆,大小為k//定義:priority_queue<Type, Container, Functional>//Type 就是數據類型,Container 就是容器類型(Container必須是用數組實現的容器,比如vector,deque等等,但不能用 list。STL里面默認用的是vector),Functional 就是比較的方式。priority_queue<pair<int,int>,vector<pair<int,int>>,mycompare> pri_que;//3、用固定大小為k的小頂堆,掃面所有頻率的數值 for(auto it=map.begin();it!=map.end();it++){pri_que.push(*it);if(pri_que.size()>k) pri_que.pop();// 如果堆的大小大于了K,則隊列彈出,保證堆的大小一直為k}// 4、找出前K個高頻元素,因為小頂堆先彈出的是最小的,所以倒敘來輸出到數組,正序輸出也可以for(int ii=k-1;ii>=0;ii--){res[ii]=pri_que.top().first;pri_que.pop();}return res;} };

總結

以上是生活随笔為你收集整理的前K个高频元素(top k)(TX)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。