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

在这里插入图片描述
利用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;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值