一、題目介紹
給定一個非空的整數數組,傳回其中出現頻率前 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 n) , n 是數組的大小。
二、解題思路
本題難點在于時間複雜度由于O(nlog n)。
(1)周遊一遍數組,利用哈希映射map可以在O(n)的時間複雜度内,确定每個元素的出現次數。
(2)将map中的每個元素放入優先隊列(即大頂堆)中,可以在log n的時間複雜度内,根據出現次數完成降序排列。
(3)将優先隊列的前K個元素取出。總的時間複雜度O(n + log n + k) ≈ O(n)
三、解題代碼
struct cmp //比較函數
{
bool operator()(pair<int, int> a, pair<int, int> b)
{
return a.second < b.second; //降序排列
}
};
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
map<int, int> mp;
for(int i = 0; i < nums.size(); ++i)
{
mp[nums[i]]++;
}
priority_queue<pair<int, int>, vector<pair<int, int>>, cmp> v(mp.begin(), mp.end()); //初始化優先隊列
vector<int> res;
for(int i = 0; i < k; ++i)
{
res.push_back(v.top().first);
v.pop();
}
return res;
}
};
四、解題結果
