【leetcode】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.

  • バケツのソートを利用して、3段階に分けて解決し、時間の代価O(n):
  • 各数の出現頻度を統計し、unordered_が存在する.map中
  • vector>コンテナを定義し、各周波数に対応する数をvectorの
  • に存在させる.
  • 容器を逆順序で遍歴する、結果容器にk個の数を順次格納
  • .
    class Solution {
    public:
        vector topKFrequent(vector& nums, int k)
        {
            unordered_map dict;
            vector result;
            for (auto n : nums)
                ++dict[n];
            vector< vector > freq(nums.size() + 1);
            for (auto p : dict)
                freq[p.second].push_back(p.first);
            for (int i = freq.size() - 1; i >= 0 && result.size() < k; --i)
            {
                for (auto n : freq[i])
                {
                    result.push_back(n);
                    if (result.size() == k)
                        break;
                }
            }
            return result;
        }
    };