數據結構也是有高低級之分的
保證每次取出的元素是隊列中優先級最高的,有限級別能夠自定義。
本質:
二叉堆的結構,利用一個數組結構來實現徹底二叉樹。
算法
數組裏的第一個元素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; }