LeetCode 347. Top K Frequent Elements

public List<Integer> topKFrequent(int[] nums, int k) {
		HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
		List<Integer> res = new ArrayList<Integer>();
		
		for(int i = 0; i < nums.length; i++) {
			map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);
		}
		
		ArrayList<Integer>[] bucket = new ArrayList[nums.length + 1];
		
		for(int key : map.keySet()) {
			int times = map.get(key);
			if(bucket[times] == null) {
				bucket[times] = new ArrayList<Integer>();
			}
			bucket[times].add(key);
		}
		
		for(int i = bucket.length - 1; i >= 0 && res.size() < k; i--) {
			if(bucket[i] != null) {
				res.addAll(bucket[i]);
			}
		}
		return res;
	}

如果这题求最大出现次数的那个元素是很简单的,本题的难度在于求多个。

本题的关键点:

1.首先用map将元素作为键,将次数作为值;

2.设置一个数组,这个数组的下标为出现次数,值为元素;

3.遍历map,将bucket初始化;

4.从后往前遍历bucket,注意:res.size() == k时结束,否则有两个相同出现次数的元素时,答案错误。


另外一题与此题也很相似 692. Top K Frequent Words

public List<String> topKFrequent(String[] words, int k) {
		HashMap<String, Integer> map = new HashMap<String, Integer>();
		
		for(String s : words) {
			map.put(s, map.getOrDefault(s, 0) + 1);
		}
		
		@SuppressWarnings("unchecked")
		ArrayList<String>[] frequence = new ArrayList[words.length + 1];
		for(String s : map.keySet()) {
			int time = map.get(s);
			if(frequence[time] == null) {
				frequence[time] = new ArrayList<String>();
			}
			frequence[time].add(s);
		}
		
		List<String> res = new ArrayList<String>();
		for(int i = frequence.length - 1; i > 0 && res.size() < k; i--) {
			if(frequence[i] != null) {
				Collections.sort(frequence[i]);
				if(res.size() + frequence[i].size() > k) {
					int len = res.size();
					for(int j = 0; j < k - len; j++) {
						res.add(frequence[i].get(j));
					}
				} else {
					res.addAll(frequence[i]);
				}
			}
		}
		
		return res;
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值