天天看點

LeetCode 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 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;
    }
};
           

四、解題結果

LeetCode 347——前K個高頻元素