面試系列 - 高級數據結構

數據結構也是有高低級之分的

數據結構

優先隊列

與普通隊列的區別:

保證每次取出的元素是隊列中優先級最高的,有限級別能夠自定義。
本質:
二叉堆的結構,利用一個數組結構來實現徹底二叉樹。
image.png算法

特性:

數組裏的第一個元素array[0]擁有最高的優先級
給定一個下標i,那麼對於元素array[i]而言
父節點 對應的元素下標是(i-1)/2
左側子節點 對應的元素下標是2*i + 1
右側子節點 對應的元素下標是2*i + 2
數組中的每一個元素的優先級都必需要高於它兩側子節點數組

例題

給定一個非空的整數數組,返回其中出現頻率前 高的元素。
示例 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;
}
相關文章
相關標籤/搜索