347前 K 個高頻元素(雜湊表、堆排序)
1、題目描述
給定一個非空的整數陣列,返回其中出現頻率前 k 高的元素。
提示:
- 你可以假設給定的 k 總是合理的,且 1 ≤ k ≤ 陣列中不相同的元素的個數。
- 你的演算法的時間複雜度必須優於 O(n log n) , n 是陣列的大小。
- 題目資料保證答案唯一,換句話說,陣列中前 k 個高頻元素的集合是唯一的。
- 你可以按任意順序返回答案。
2、示例
輸入: nums = [1,1,1,2,2,3], k = 2
輸出: [1,2]
3、題解
解法一:
基本思想:小頂堆,構造前k個最大頻率元素的小頂堆
解法二:
基本思想:雜湊表(好的資料結構是成功的一半),先對元素對應計數對映得到map cnt,然後反向計數對應元素對映得到map Map,因為可能同一個計數對應多個元素所以value是vector<int>,因為map是紅黑樹,所以已經排序好了,只要從尾到頭取k個元素即可。
#include<iostream>
#include<vector>
#include<algorithm>
#include<map>
#include<queue>
using namespace std;
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
//基本思想:小頂堆,構造前k個最大頻率元素的小頂堆
vector<int> res;
map<int,int> cnt; //元素計數,key是元素,value是計數
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> min_heap;
for(int i=0;i<nums.size();i++)
cnt[nums[i]]++;
for(auto iter=cnt.begin();iter!=cnt.end();iter++)
{
min_heap.push(pair<int,int>(iter->second,iter->first));
if(min_heap.size()>k)
min_heap.pop();
}
while(!min_heap.empty())
{
res.push_back(min_heap.top().second);
min_heap.pop();
}
return res;
}
};
class Solution1 {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
//基本思想:雜湊表,先對元素對應計數對映得到map cnt,然後反向計數對應元素對映得到map Map
//因為可能同一個計數對應多個元素所以value是vector<int>,因為map是紅黑樹,所以已經排序好了,只要從尾到頭取k個元素即可
vector<int> res;
map<int,int> cnt; //元素對應計數對映
map<int,vector<int>> Map; //計數對應元素對映
for(int i=0;i<nums.size();i++)
cnt[nums[i]]++;
for(auto iter=cnt.begin();iter!=cnt.end();iter++)
Map[iter->second].push_back(iter->first);
int n=0;
for(auto iter=Map.rbegin();iter!=Map.rend()&&n<k;iter++)
{
res.insert(res.end(),(iter->second).begin(),(iter->second).end());
n+=(iter->second).size();
}
return res;
}
};
int main()
{
Solution solute;
vector<int> nums={5,2,5,3,5,3,1,1,3};
int k=2;
vector<int> res=solute.topKFrequent(nums,k);
for_each(res.begin(),res.end(),[](auto v){cout<<v<<endl;});
return 0;
}
相關文章
- 347. 前 K 個高頻元素
- Leetcode——347. 前K個高頻元素LeetCode
- 程式碼隨想錄 第13天 | ● 239. 滑動視窗最大值 ● 347.前 K 個高頻元素 ● 總結
- 程式碼隨想錄——棧與佇列8-前K個高頻元素佇列
- 雜湊表(雜湊表)詳解
- 雜湊表(雜湊表)原理詳解
- Day10(棧與佇列) | 150. 逆波蘭表示式求值 239. 滑動視窗最大值 347.前 K 個高頻元素佇列
- 雜湊表
- 程式碼隨想錄刷題day 11 | **150. 逆波蘭表示式求值** **239. 滑動視窗最大值** **347.前 K 個高頻元素**
- 【尋跡#3】 雜湊與雜湊表
- 【閱讀筆記:雜湊表】Javascript任何物件都是一個雜湊表(hash表)!筆記JavaScript物件
- 字串雜湊表字串
- 6.7雜湊表
- 查詢(3)--雜湊表(雜湊查詢)
- 深入理解雜湊表(JAVA和Redis雜湊表實現)JavaRedis
- C# 雜湊表Hashtable與字典表Dictionary<K,V>的比較。C#
- 雜湊表應用
- 雜湊表的原理
- 實現雜湊表
- 淺談雜湊表
- LeetCode題解(0692):前K個高頻單詞(Python)LeetCodePython
- 符號表與雜湊表符號
- 程式碼隨想錄演算法訓練營第十二天|150.逆波蘭表示式求值、239.滑動視窗最大值、347.前k個高頻元素演算法
- 程式碼隨想錄演算法訓練營day11|150. 逆波蘭表示式求值 239. 滑動視窗最大值 347.前 K 個高頻元素演算法
- 【六褘-Java】雜湊演算法記憶體圖;set集合低層採用雜湊表儲存元素;雜湊演算法的流程Java演算法記憶體
- [M設計+雜湊表] lc380. 常數時間插入、刪除和獲取隨機元素(設計+雜湊表)隨機
- 幾道和雜湊(雜湊)表有關的面試題面試題
- R語言——雜湊表R語言
- JAVA 實現 - 雜湊表Java
- 雜湊技術【雜湊表】查詢演算法 PHP 版演算法PHP
- 2024.9.4 leetcode 169 多數元素 (雜湊表)LeetCode
- 【資料結構與演算法學習】雜湊表(Hash Table,雜湊表)資料結構演算法
- 資料結構——雜湊表資料結構
- freeswitch APR庫雜湊表
- 談談面試--雜湊表系列面試
- 雜湊表(Hash)的應用
- 坑系列 —— 快取 + 雜湊 = 高併發?快取
- 資料結構之「雜湊表」資料結構