topN问题:思路:排序,优先队列,map

1、前k个高频元素

题目:

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

示例 1:

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/top-k-frequent-elements

思路:

使用map储存元素与出现的次数,然后按照出现次数作为优先级,将元素储存到优先级队列中,随后输出队列的前k个元素即可。

代码:

  1. package com.example.demo.core.Leecode;
  2. import java.util.Arrays;
  3. import java.util.HashMap;
  4. import java.util.PriorityQueue;
  5. import java.util.Set;
  6. /**
  7. * @author: HanXu
  8. * on 2022/2/22
  9. * Class description: topN问题
  10. */
  11. public class TopN {
  12. public static void main(String[] args) {
  13. int[] arr = {1, 1, 1, 2, 2, 3};
  14. int n = 2;
  15. System.out.println(Arrays.toString(topKFrequent(arr, n)));
  16. }
  17. /**
  18. * 前k个高频元素:给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
  19. * 使用map储存元素与出现的次数,然后按照出现次数作为优先级,将元素储存到优先级队列中,随后输出队列的前k个元素即可。
  20. * @param nums
  21. * @param k
  22. * @return
  23. */
  24. public static int[] topKFrequent(int[] nums, int k) {
  25. HashMap<Integer, Integer> map = new HashMap<>();
  26. for (int i = 0; i < nums.length; i++) {
  27. map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);
  28. }
  29. //存的时候,按照出现次数从大到小排序
  30. PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(((o1, o2) -> (map.get(o2) - map.get(o1))));
  31. Set<Integer> keySet = map.keySet();
  32. for (Integer key : keySet) {
  33. priorityQueue.offer(key);
  34. }
  35. //取出前k个元素
  36. int[] result = new int[k];
  37. for (int i = 0; i < k; i++) {
  38. result[i] = priorityQueue.poll();
  39. }
  40. return result;
  41. }
  42. }

2、数组中的第K个最大元素

题目:

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

示例 1:

输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例 2:

输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array

思路:

根据示例2可以看出来,相同的元素不被认为是同一个最大元素,两个5分别是第2大、第3大元素

  • 直接排序,然后输出length-k索引位置的元素。
  • 使用优先队列,储存元素时按照从大到小排序,然后清除队列中的前k-1个元素,返回头部元素就是第k个最大元素。

代码:

  1. package com.example.demo.core.Leecode;
  2. import java.util.Arrays;
  3. import java.util.HashMap;
  4. import java.util.PriorityQueue;
  5. import java.util.Set;
  6. /**
  7. * @author: HanXu
  8. * on 2022/2/22
  9. * Class description:
  10. */
  11. public class TopN {
  12. public static void main(String[] args) {
  13. int[] arr = {3, 2, 3, 1, 2, 4, 5, 5, 6};
  14. int k = 4;
  15. // System.out.println(findKthLargest1(arr, k));
  16. System.out.println(findKthLargest2(arr, k));
  17. }
  18. /**
  19. * 数组中的第K个最大元素:给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
  20. * @param nums
  21. * @param k
  22. * @return
  23. */
  24. public static int findKthLargest1(int[] nums, int k) {
  25. Arrays.sort(nums);
  26. return nums[nums.length - k];
  27. }
  28. public static int findKthLargest2(int[] nums, int k) {
  29. PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(((o1, o2) -> (o2 - o1)));
  30. for (int i = 0; i < nums.length; i++) {
  31. priorityQueue.add(nums[i]);
  32. }
  33. for (int i = 0; i < k - 1; i++) {
  34. priorityQueue.remove();
  35. }
  36. return priorityQueue.poll();
  37. }
  38. }