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


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

leetcode_347 Top K Frequent Elements

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

leetcode-java-347. Top K Frequent Elements

思路: 1.先通过map统计 2.对map的value排序 3.取出map中的前k个keypublic class Solution { public List topKFrequent...
  • github_34514750
  • github_34514750
  • 2016年06月26日 20:52
  • 322

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...
  • ruobing2011
  • ruobing2011
  • 2016年06月10日 14:32
  • 474

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
  • 1159

347. Top K Frequent Elements

Top K Frequent Elements原题介绍 Given a non-empty array of integers, return the k most frequent elemen...
  • lilingyu520
  • lilingyu520
  • 2016年05月07日 20:39
  • 2116

[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...
  • TstsUgeg
  • TstsUgeg
  • 2016年05月03日 20:25
  • 1752

LeetCode136. Single Number(java)

Given an array of integers, every element appears twice except for one. Find that single one. Note:...
  • katrina95
  • katrina95
  • 2018年01月12日 06:31
  • 20

Top K Frequent Elements=-leetcode

题目Given a non-empty array of integers, return the k most frequent elements.For example, Given [1,1,...
  • zhouyelihua
  • zhouyelihua
  • 2016年05月09日 00:49
  • 1956

【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
  • 4595

347. Top K Frequent Elements [medium] (Python)

题目链接https://leetcode.com/problems/top-k-frequent-elements/题目原文 Given a non-empty array of integers...
  • coder_orz
  • coder_orz
  • 2016年07月30日 21:04
  • 1421
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【LeetCode】347. Top K Frequent Elements——基于Java的解决方案
举报原因:
原因补充:

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