LeetCode|Top K Frequent Elements

来源:互联网 发布:数据库范式举例 编辑:程序博客网 时间:2024/06/05 05:46

Top K Frequent Elements

Given a non-empty array of integers, return the k most frequent elements.

For example,
Given [1,1,1,2,2,3] and k = 2, return [1,2].

Note:

  • You may assume k is always valid, 1 ≤ k ≤ number of unique elements.
  • Your algorithm’s time complexity must be better than O(n log n), where n is the array’s size.

思路:
这道题与Kth Largest Element in an Array思路相同参考题解

  1. hash表用来统计出现的频率
  2. 分治法找到最大的K个数。利用快速排序partition的思想,每次把不小于pivot的数放左边,小于pivot的数放右边。最后判断一下pivot的下标与k-1的关系,然后返回pivot或者缩小范围继续递归。

空间复杂度为O(n),时间复杂度O( n log k)

class Solution {public:    vector<int> topKFrequent(vector<int>& nums, int k) {        unordered_map<int, int> um; // 空间O(n)   val->num        for(int i = 0; i < nums.size(); i++) um[nums[i]]++; // 时间O(n)        vector< pair<int, int> > v;// 空间O(n)        for(unordered_map<int, int>::iterator it = um.begin(); it != um.end(); it++){ // 时间O(n)            int val = it->first;            int num = it->second;            v.push_back( std::pair<int, int>(val, num) );        }        return helper(v, 0, v.size()-1, k);    }private:    vector<int> helper(vector<pair<int, int> >& v, int s, int e, int k){        int lastLarge = s;        for(int i = s+1; i <= e; i++){            if(((v[i]).second) >= ((v[s]).second))                swap(v[++lastLarge], v[i]);        } swap( v[s], v[lastLarge]);        if(lastLarge == k-1) {           vector<int> res;           for(int i = 0; i < k; i++){                res.push_back(v[i].first);           } return res;        }        if(lastLarge < k) return helper(v, lastLarge+1, e, k); // lastLarge < k-1        return helper(v, s, lastLarge-1, k); // lastLarge >= k    }};
1 0
原创粉丝点击