leetcode每日一题 前k个高频元素 使用java实现(哈希表)

前K个高频元素

给定一个非空的整数数组,返回其中出现频率前 k 高的元素。

解题步骤

首先我们需要获取每一个元素所对应的出现的频率,如何获取?

使用键值对来实现,将元素的值设置为key,将出现的频率设置为value。遍历数组,如果存在该值,将键值对的value数值+1,也就是频率+1。

实现代码:

class test{
	public int[] initHashMap01(int[] nums){
		HashMap<Integer, Integer> map = new HashMap<>();
        for (int num : nums) {
            map.put(num, map.getOrDefault(num, 0) + 1);
            //map.getOrDefault(key, value):如果map存在key值,返回该key所对应的值,否则返回一个自定义初始值value。
        }
	}
	public int[] initHashMap02(int[] nums){
		HashMap<Integer, Integer> map = new HashMap<>();
		for(int num: nums){
			if(map.containsKey(num)){
				map.put(num, get(num)+1);
			}else{
				map.put(num, 1);
			}
		}
	}
}

其次我们要将value排序,选择最大的k个值,并将所对应的key存放在数组中,并输出!

思路:如果通过一个value寻找key,不一定是唯一的,但是key寻找value是简单的。

但是如何转换也是该问题的一大难点。既然是采用哈希,我们就把哈希图贯彻到底,将value作为索引,并将相同的元素key值作为一个链表,从而实现该结果。

class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int num : nums) {
            map.put(num, map.getOrDefault(num, 0) + 1);
        }
        
        List<Integer>[] list= new List[nums.length + 1];
        for (int key : map.keySet()) {
            int value= map.get(key);
            if (list[value] == null) {
                list[value] = new LinkedList<>(); 
            }
            list[value].add(key);
        }
        
        List<Integer> ans = new ArrayList<>();
        for (int i = list.length - 1; i >= 0 && ans.size() < k; i--) {
            if (list[i] != null) {
                ans.addAll(list[i]);
            }
        }
        return ans.stream().mapToInt(Integer::valueOf).toArray();//将List转换成int数组
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值