LeetCode堆操作高频题(八)

大家好,我是方圆
无它,唯手熟尔

题号

    • 215. 数组中的第K个最大元素
    • 347. 前K个高频元素

215. 数组中的第K个最大元素

LeetCode堆操作高频题(八)_第1张图片

import java.util.PriorityQueue;

class Solution {
    public int findKthLargest(int[] nums, int k) {
        //建立一个堆,加入的值从大到小排序,那么我们需要的最终值
        //就是堆顶元素
        PriorityQueue<Integer> heap = new PriorityQueue<>((n1,n2) -> n1 - n2);

        for(int n : nums){
            //向堆中不断的加元素
            heap.add(n);
            //我们要的值是k个数中最小的
            //维持堆的大小
            if(heap.size() > k){
                heap.poll();
            }
        }
        return heap.poll();
    }
}

347. 前K个高频元素

LeetCode堆操作高频题(八)_第2张图片

class Solution {
    public List<Integer> topKFrequent(int[] nums, int k) {
        //统计每个元素及其次数
        HashMap<Integer,Integer> map = new HashMap<>();
        for(Integer num : nums){
            if(map.containsKey(num)){
                map.put(num,(map.get(num) + 1));
            }else{
                map.put(num,1);
            }
        }

        //用最小堆来存频率最大的k个元素
        PriorityQueue<Integer> heap = new PriorityQueue<>((n1,n2) -> map.get(n1) - map.get(n2));
        for(Integer key : map.keySet()){
            if(heap.size() < k){
                heap.add(key);
            }else if(map.get(key) > map.get(heap.peek())){
                heap.remove();
                heap.add(key);
            }
        }

        List<Integer> ans = new ArrayList<>();
        while(! heap.isEmpty()){
            ans.add(heap.remove());
        }
       
        return  ans;
    }
}

多写多练!

你可能感兴趣的:(LeetCode)