数据结构也是有高低级之分的
保证每次取出的元素是队列中优先级最高的,有限级别能够自定义。
本质:
二叉堆的结构,利用一个数组结构来实现彻底二叉树。算法
数组里的第一个元素array[0]拥有最高的优先级
给定一个下标i,那么对于元素array[i]而言
父节点 对应的元素下标是(i-1)/2
左侧子节点 对应的元素下标是2*i + 1
右侧子节点 对应的元素下标是2*i + 2
数组中的每一个元素的优先级都必需要高于它两侧子节点数组
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
示例 1:数据结构
输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2]
示例 2:spa
输入: nums = [1], k = 1 输出: [1]
说明:
你能够假设给定的 k 老是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。
你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。code
public static List<Integer> topKFrequent(int[] nums, int k) { // 首先咱们须要先经过map将数据进行整理 Map<Integer, Integer> map = new HashMap<>(); for (int num : nums) { int a = map.get(num) == null ? 0 : map.get(num); map.put(num, a + 1); } // 使用优先队列进行数据的整理,优先队列默认排序是从高到低的 Queue<Integer> queue = new PriorityQueue<>( // 按照出现频率从低到高排序 Comparator.comparingInt(map::get) ); // 须要将数据循环放入优先队列中,若是超过k个的话就弹出最上面的 for (Integer a : map.keySet()) { queue.add(a); if (queue.size() > k) { queue.poll(); } } List<Integer> list = new ArrayList<>(k); // 循环添加k个值进入list中,返回便可 while (!queue.isEmpty()) { list.add(queue.poll()); } return list; }