前 K 个高频元素 --java记录

前 K 个高频元素 --java记录_第1张图片
利用map ,key为数值,value为数值出现的次数。
根据value值进行逆序排序
然后输出前k

	 
	public List<Integer> topKFrequent(int[] nums, int k) {
    	HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
    	List<Integer> list = new ArrayList<Integer>();
    	for(int i = 0; i < nums.length ; i++) {
    		map.put(nums[i], map.getOrDefault(nums[i], 0)+1);
    	}
    	List<Map.Entry<Integer, Integer>> tlist = new ArrayList<>(map.entrySet());
    	//对tlist 进行你排序
    	Collections.sort(tlist, new Comparator< Map.Entry<Integer, Integer>>(){    
    		@Override
    		public int compare(Map.Entry<Integer, Integer> o1,Map.Entry<Integer, Integer> o2) {
    			return o2.getValue() - o1.getValue();
    		}  	
    	});//对任意类型集合对象进行整体排序,排序时将此接口的实现传递给Collections.sort方法.实现int compare(T o1, T o2);方法,返回正数,零,负数各代表大于,等于,小于。
    	
    	for(int j = 0 ;j < k ; j++) {
    		list.add(tlist.get(j).getKey());  //将tlist 中前k个 key值存入list
    	}
    	
    	 
    	 return list;
    }

参考
桶排序,记录。

class Solution {
    	 
	public List<Integer> topKFrequent(int[] nums, int k) {
    	HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
    	List<Integer> list = new ArrayList<Integer>();
    	for(int i = 0; i < nums.length ; i++) {
    		map.put(nums[i], map.getOrDefault(nums[i], 0)+1);
    	}
    	//桶排序  bucket大小为nums 大小+1。 map中value值作为索引,防止数组下标错误,列如[1,1,1,1]    则bucket[4] 里面放key值 1 。
    	
    	List <Integer>[] bucket = new List[nums.length +1];
    	for(Map.Entry<Integer, Integer> entry : map.entrySet()) {
    		int index = (int) entry.getValue();     //取 value 作为桶的索引(外层数组),并创建list
    		if(bucket[index] == null) {
    			bucket[index] = new ArrayList<Integer>();   
    		}
    		bucket[index].add((Integer) entry.getKey());  //将value  相同的放入一个list中
    	}
    	 
    	
    	
    	for(int j = nums.length  ;j >0 && list.size() < k ; j--) {
    		 if(bucket[j] != null) { 
    			  list.addAll(bucket[j]);   //将满足条件的一个桶中所有值添加到 list中
    		 }
    		  
    	}
    	
    	 
    	 return list;
    }
}

你可能感兴趣的:(Leecode)