• 347. Top K Frequent Elements (sort map)


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

    Example 1:

    Input: nums = [1,1,1,2,2,3], k = 2
    Output: [1,2]
    

    Example 2:

    Input: nums = [1], k = 1
    Output: [1]

    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.
     Approach #1: C++.
    class Solution {
    public:
        vector<int> topKFrequent(vector<int>& nums, int k) {
            unordered_map<int, int> mp;
            for (int i : nums) 
                mp[i]++;
            vector<pair<int, int>> v(mp.begin(), mp.end());
            sort(v.begin(), v.end(), cmp);
            vector<int> ans;
            for (int i = 0; i < k; ++i)
                ans.push_back(v[i].first);
            return ans;
        }
        
    private:
        static bool cmp(pair<int, int> a, pair<int, int> b) {
            return a.second > b.second;
        }
    };
    

    In order to sort the map with it's value, we can't sort it directly because the iterator type on std::unordered_map is a ForwardIterator, not a RandomAccessIterator, so the first requirement is unsatisfied. The type of the dereferenced iterator is pair<const Key, T>, which is not MoveAssignable (can't assign to const), so the second requirement is also unsatisfied.

    we can use a vector to contain the unordered_map, then sort the vector.

    Approach #2: Java.

    class Solution {
        public List<Integer> topKFrequent(int[] nums, int k) {
            List<Integer>[] bucket = new List[nums.length+1];
            Map<Integer, Integer> frequencyMap = new HashMap<Integer, Integer>();
            
            for (int n : nums) {
                frequencyMap.put(n, frequencyMap.getOrDefault(n, 0) + 1);
            }
            
            for (int key : frequencyMap.keySet()) {
                int frequency = frequencyMap.get(key);
                if (bucket[frequency] == null)
                    bucket[frequency] = new ArrayList<>();
                bucket[frequency].add(key);
            }
            
            List<Integer> res = new ArrayList<>();
            
            for (int pos = bucket.length - 1; pos >= 0 && res.size() < k; --pos) {
                if (bucket[pos] != null)
                    res.addAll(bucket[pos]);
            }
            return res;
        }
    }
    

      

    Approach #3: Python.

    class Solution(object):
        def topKFrequent(self, nums, k):
            """
            :type nums: List[int]
            :type k: int
            :rtype: List[int]
            """
            return zip(*collections.Counter(nums).most_common(k))[0]
    
     

    11.Use Counter to extract the top k frequent elements, most_common(k) return a list of tuples, where the first item of the tuple is the element, and the second item of the tuple is the count, Thus,the built-in zip function could be used to extract the first item from the tuples

    Time SubmittedStatusRuntimeLanguage
    3 minutes ago Accepted 40 ms python
    5 minutes ago Accepted 12 ms java
    20 minutes ago Accepted 12 ms cpp
    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    prettier 与 eslint 对比
    vscode快捷键补充
    什么是函数式编程
    让Chrome看不了WWDC直播的HLS技术详解
    IPv6启动五年后,距离我们究竟还有多远?
    WebSocket+MSE——HTML5 直播技术解析
    为什么各大厂商要抢先跟进H.265?
    如何通过 WebP 兼容减少图片资源大小
    IPv6,AppStore 审核不是唯一选择它的原因
    为什么非全站升级HTTPS不可?
  • 原文地址:https://www.cnblogs.com/h-hkai/p/9963661.html
Copyright © 2020-2023  润新知