LeetCode-347.Top K Frequent Elements

原创 2016年06月01日 20:04:46

https://leetcode.com/problems/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.
先统计各数的频率,再根据词频分组,最后输出最后的k个数。代码比较繁琐

public IList<int> TopKFrequent(int[] nums, int k) 
    {
        IList<int> res = new List<int>();
        Hashtable table = new Hashtable();
        SortedList<int, List<int>> list = new SortedList<int, List<int>>();
        for (int i = 0; i < nums.Length; i++)
        {
            if (table.Contains(nums[i]))
                table[nums[i]] = (int)table[nums[i]] + 1;
            else
                table.Add(nums[i], 1);
        }
        foreach (DictionaryEntry item in table)
        {
            if (list.ContainsKey((int)item.Value))
                list[(int)item.Value].Add((int)item.Key);
            else
                list.Add((int)item.Value, new List<int>() { (int)item.Key });
        }
        for (int i = list.Count - 1; i >= 0; i--)
        {
            foreach (int item in list.ElementAt(i).Value)
            {
                res.Add(item);
                if (--k == 0)
                    return res;
            }
        }
        return res;
    }

C++实现,使用优先队列 参考https://leetcode.com/discuss/100562/o-log-k-unordered_map-and-priority_queue-maxheap-solution

#include <vector>
#include <map>
#include <queue>
using namespace std;
vector<int> topKFrequent(vector<int>& nums, int k) 
{
	map<int,int> mapping;
	for (auto elem : nums) 
		mapping[elem]++;

	vector<int> res;
	priority_queue<pair<int,int>> prioQue;
	for (auto it : mapping)
	{
		prioQue.push(make_pair(it.second, it.first));
		if (prioQue.size() > mapping.size() - k) 
		{
			res.push_back(prioQue.top().second);
			prioQue.pop();
		}
	}
	return res;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

Top K Frequent Elements 选出数组中出现次数最多的k个元素

原题地址:https://leetcode.com/problems/top-k-frequent-elements/,这个题目要求时间复杂度不能超过O(nlgn),也就是说常规的排序算法不可行(排序...
  • x_i_y_u_e
  • x_i_y_u_e
  • 2016年08月22日 17:49
  • 1090

k个最大的数及变种小结

k个最大的数及变种小结k个最大的数及变种小结 声明 堆实现 求k个最大的数 1 解法1 最大堆实现OnlognOnlog n时间复杂度 2 解法2 最小堆实现OnlognOnlog n时间复杂度 3 ...
  • J_Dark
  • J_Dark
  • 2017年06月04日 16:35
  • 395

频繁模式挖掘(Frequent Pattern Mining)

频繁模式挖掘()
  • OrthocenterChocolate
  • OrthocenterChocolate
  • 2014年09月28日 09:45
  • 10005

347. Top K Frequent Elements(找出数组中出现次数最多的前k个元素)

Given a non-empty array of integers, return the k most frequent elements. For example, Given [1,1,1...
  • xiangwanpeng
  • xiangwanpeng
  • 2016年11月16日 11:28
  • 358

HDU 3584 Cube(三维树状数组)

Cube Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Su...
  • Mr_Treeeee
  • Mr_Treeeee
  • 2017年08月06日 22:25
  • 116

第K大/Top K及其简单实现

第K大:快排、最小堆、计数、二分、排序k个
  • u012469987
  • u012469987
  • 2016年08月14日 19:28
  • 2711

【LeetCode-面试算法经典-Java实现】【189-Rotate Array(旋转数组)】

【189-Rotate Array(旋转数组)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Rotate an array of n elements to the r...
  • DERRANTCM
  • DERRANTCM
  • 2015年08月24日 07:13
  • 3036

【poj 3368】Frequent values 题意&题解&代码(C++)

poj 线段树
  • DERITt
  • DERITt
  • 2016年04月05日 10:28
  • 265

chrome开发者工具功能拾遗:Elements面板篇

本文主要介绍一些本人在此之前不甚了解,但经过了解后又发现对自己的工作很有帮助的一些chrome开发者工具调试技巧/功能。也借这篇文章提醒一下自己,在实际项目中多使用这些功能,尽快熟悉起来,提升自己的工...
  • array_huang
  • array_huang
  • 2015年12月03日 17:59
  • 904

HDU3584 Cube【树状数组】【三维】

题目大意: 给定一个N*N*N多维数据集A,其元素是0或是1。A[i,j,k]表示集合中第 i 行,第 j 列与第 k 层的值。 首先由A[i,j,k] = 0(1 ...
  • u011676797
  • u011676797
  • 2015年05月13日 12:38
  • 741
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LeetCode-347.Top K Frequent Elements
举报原因:
原因补充:

(最多只允许输入30个字)