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

Subscribe to see which companies asked this question

 Step1:借助hashmap统计数组中个元素出现的次数;
 Step2:把hashmap中的元素都放到一个list中,该list中的元素为entity; 
 Step3:取出符合条件的前k个。

   做这个题目用到的知识点有:内部类、集合中元素的比较、遍历hashmap。

/**
	 * 输入一个数组和一个k,假设k的输入是合法的。求该数组中出现频率在前k位的元素。
	 * 
	 * Step1:借助hashmap统计数组中个元素出现的次数;
	 * Step2:把hashmap中的元素都放到一个list中,该list中的元素为entity; 
	 * Step3:取出符合条件的前k个。
	 * 
	 * @date 20160505
	 * @param nums
	 * @param k
	 * @return
	 */
	public List<Integer> topKFrequent(int[] nums, int k) {
		int len = nums.length;
		if(len <= 0){
			return null;
		}
		/*Step1:借助hashmap统计数组中个元素出现的次数;*/
		HashMap<Integer,Integer> map = new HashMap<Integer,Integer>(len);
		int num =0;
		for(int i=0;i<len;i++){
			num =0;
			if(map.containsKey(nums[i])){
				num = map.get(nums[i]);
			}
			num++;
			map.put(nums[i], num);
		}
		/*Step2:把hashmap中的元素都放到一个list中,该list中的元素为entity;*/
		List<Entity> list = new ArrayList<Entity>(len);
		
		java.util.Iterator<Entry<Integer, Integer>> it = map.entrySet().iterator();
		  while (it.hasNext()) {
		    Map.Entry entry = (Map.Entry) it.next();
		    int key = (int) entry.getKey();
		    int value = (int) entry.getValue();
		    list.add(new Entity(key,value));
		   }
		
		  System.out.println("list.size() = "+list.size());
		/*Step3:取出符合条件的前k个*/
		   Collections.sort(list);
		   
		   for(int i = 0;i<list.size();i++){
			   System.out.println(list.get(i).element + "  "+list.get(i).fre);
		   }
		   
		   
		   List<Integer> result = new ArrayList<Integer>(k);
		   for(int i = 0;i<k;i++){
			   result.add(list.get(i).element);
		   }
		   return result;
	}

	/**
	 * @ 包含两个属性,数组中的元素及其对应的出现次数。 并实现将对象按照出现的次数从高到低进行排序。
	 */
	public class Entity implements Comparable<Entity> {

		int element;// 元素
		int fre;// 元素出现次数

		public Entity(int element, int fre) {
			this.element = element;
			this.fre = fre;
		}


		@Override
		public int compareTo(Entity vo) {
			if(fre == vo.fre){
				return 0;
			}else if(fre > vo.fre){
				return -1;
			}else{
				return 1;
			}
			
		}

	}


你可能感兴趣的:(117.Top K Frequent Elements)