当前位置:   article > 正文

Leetcode347:前K个高频元素_leetcode 347 用例

leetcode 347 用例

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

示例 1:

输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:

输入: nums = [1], k = 1
输出: [1]
说明:

你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。
你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。

	public List<Integer> topKFrequent(int[] nums, int k) {


		//统计每个元素出现的频率
		Map<Integer, Integer> map = new HashMap<>();
		for (int num : nums) {
			map.put(num, map.getOrDefault(num, 0) + 1);
		}

		//扫描map 维护当前出现频率最高的k个元素
		//在优先队列中,按照频率排序,所以数据对是(频率,元素)的形式
		Queue<Pair<Integer, Integer>> pq = new PriorityQueue<>((o1, o2) -> {
			if (o1.getKey() < o2.getKey())
				return -1;
			else if (o1.getKey().equals(o2.getKey()))
				return 0;
			if (o1.getKey() > o2.getKey())
				return 1;
			return 0;
		});

		for (Integer num : map.keySet()) {
			int freq = map.get(num);
			if (pq.size()==k){
				Pair<Integer, Integer> pair = pq.peek();
				if (pair.getKey()<freq){
					pq.remove();
					pq.add(new Pair<>(freq, num));
				}
			}else {
				pq.add(new Pair<>(freq, num));
			}
		}

		List<Integer> res = new ArrayList<>();
		while (!pq.isEmpty()) {
			res.add(pq.remove().getValue());
		}
		return res;
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/72749
推荐阅读
相关标签
  

闽ICP备14008679号