【LeetCode】347. Top K Frequent Elements——基于Java的解决方案

原创 2016年05月31日 22:43:35

347. Top K Frequent Elements

Total Accepted: 12022 Total Submissions: 28556 Difficulty: Medium

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个元素。

 【分析】

  step1.显然,为了找出数组中出现频次最多的前k个元素,首先,我们需要分别统计出数组中各个元素出现的频次,很容易想到哈希表,Java中提供了HashMap类,它实现了Map接口,HashMap是一个泛型类(HashMap<key,value>),可以用来存储键/值对,为了统计数组个元素的频次,我们可以把元素数值作为“”,对应元素出现的次数作为“,如此,我们只需要对数组进行一次遍历就可以得到一张包含不同数组元素和对应出现频次的“映射表”。

  step2.由于我们关心的是出现频次最多的前k个元素,因此,得到频次统计“映射表”之后,我们需要根据频次对映射表中的键/值对进行排序

  step3. 映射表中键(数据元素)和值(该数据元素出现的频次)是一一对应的,我们在按值进行排序的同时需要记录其对应的元素,鉴于此,我们可以采用“桶排序”的思想。由于我们是按数据元素出现的频次进行排序的,那么“桶”的数量范围是可以确定的——桶的数量小于等于给定数组元素的个数。编号为i的桶用于存放数组中出现频次为i的元素——即编号为i的桶存放“映射表”中“值”等于i的“键”

   step4. 排序完成后,编号大的桶中元素出现的频次高,因此,我们“逆序”(先取桶编号大的桶的元素)获取桶中数据,直到获取数据的个数等于k,我们将当前桶的元素取尽(同一个桶中元素出现的频次相等),然后停止取数据,完成!


【程序】

 基于Java的程序如下:

public class Solution {
   public List<Integer> topKFrequent(int[] nums, int k)
	{
		//step1—用哈希表统计数组中各元素出现的频次,表中“键”为元素数值,“值”为对应元素出现的频次
		Map<Integer,Integer> map=new HashMap<Integer,Integer>();
		for(int num:nums)//遍历数组
		{
			if(map.get(num)==null)//如果“键”为num的数据首次出现,则“值”设为1
				map.put(num, 1);
			else
				map.put(num, map.get(num)+1);//重复出现,则累计频次
		}
		
		//step2—桶排序
		List<Integer>[] bucket=new List[nums.length+1];//定义足够数量的桶
		for(int key:map.keySet())//按“键”遍历
		{
			int count=map.get(key);//获取数值为key的元素出现的频次
			//把出现频次相同的元素“扔”到序号等于频次的桶中
			if(bucket[count]==null)
			   bucket[count]=new ArrayList<Integer>();
			bucket[count].add(key);
		}
		//step3—“逆序”取数据
		List<Integer> result=new ArrayList<Integer>();
		for(int i=nums.length;i>0;i--)//注意i的起始值,当数组只有一个数据时
		{
			if(bucket[i]!=null&&result.size()<k)
				result.addAll(bucket[i]);		
		}
		return result;
	}
}

【运行结果】

You are here! 
Your runtime beats 76.92% of javasubmissions.


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

相关文章推荐

347. Top K Frequent Elements

Top K Frequent Elements原题介绍 Given a non-empty array of integers, return the k most frequent elemen...

347. Top K Frequent Element(java)

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

【Leetcode】Top K Frequent Elements

题目链接:https://leetcode.com/problems/top-k-frequent-elements/Given a non-empty array of integers, retu...
  • yeqiuzs
  • yeqiuzs
  • 2016年05月04日 10:00
  • 4373

347TopKFrequentElements

题目: 已知int数组,输入k,输出出现次数最多的k个元素 思路: 1、HashTable使用同步机制,而HashMap是HashTable的轻量级实现(需要外同步),不允许重复键(即,重复键会覆盖...

LeetCode347—Top K Frequent Elements

LeetCode347—Top K Frequent Elements

[leetcode] 347. Top K Frequent Elements

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

[leetcode] 347. Top K Frequent Elements 解题报告

题目链接:https://leetcode.com/problems/top-k-frequent-elements/ Given a non-empty array of integers, r...

LeetCode 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,...

leetcode_347 Top K Frequent Elements

题目分析:给定一个数组,返回数组中出现此多最多的k个元素,要求时间复杂度小于O(nlogn)。 解题思路:1)利用map实现统计数组中每个元素出现的次数;2)对1)统计的map按照元素出现的次数进行排...

LeetCode Top K Frequent Elements

题意:给出一个数组,求出前k个出现频率最多的数 思路:首先统计每个元素的次数(用Map),然后用堆排序只统计前k个(PriorityQueue) 代码如下: class Solution { ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【LeetCode】347. Top K Frequent Elements——基于Java的解决方案
举报原因:
原因补充:

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