Skip to content


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

java
// 方法一:优先队列,初始大小确定,参入参数k
class Solution {
    public int findKthLargest(int[] nums, int k) {
        PriorityQueue<Integer> pq = new PriorityQueue<>(k);
        for (int num : nums) {
            if (pq.size() < k) {
                pq.offer(num);
            } else if (num > pq.peek()) {
                pq.poll();
                pq.offer(num);
            }
        }
        return pq.peek();
    }
}

// 方法二,数组建堆,build一次就可以,不需要排序
class Solution {
    public int findKthLargest(int[] nums, int k) {
        int[] heap = new int[k];
        for (int i = 0; i < k; i++) {
            heap[i] = nums[i];
        }
        buildheap(heap, k);
        for (int i = k; i < nums.length; i++) {
            if (nums[i] > heap[0]) {
                heap[0] = nums[i];
                heapify(heap, 0, k);
            }
        }
        return heap[0];
    }

    public void heapify(int[] nums, int i, int n) {
        int smallest = i;
        int leftchild = 2 * i + 1;
        int rightchild = 2 * i + 2;

        if (leftchild < n && nums[leftchild] < nums[smallest]) {
            smallest = leftchild;
        }
        if (rightchild < n && nums[rightchild] < nums[smallest]) {
            smallest = rightchild;
        }
        if (smallest != i) {
            int temp = nums[i];
            nums[i] = nums[smallest];
            nums[smallest] = temp;
            heapify(nums, smallest, n);
        }
    }

    public void buildheap(int[] nums, int n) {
        for (int i = n / 2 - 1; i >= 0; i--) {
            heapify(nums, i, n);
        }
    }
}

347. 前 K 个高频元素

java
// HashMap和PriorityQueue,默认小顶堆即可,构造优先队列传入比较器
class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        int[] ans = new int[k];
        Map<Integer, Integer> map = new HashMap<>();
        PriorityQueue<Integer> pq = new PriorityQueue<>((a, b) -> map.get(a) - map.get(b));
        for (int num : nums) {
            map.put(num, map.getOrDefault(num, 0) + 1);
        }
        // entrySet()
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            int num = entry.getKey(), cnt = entry.getValue();
            if (pq.size() < k) {
                pq.offer(num);
            } else if (cnt > map.get(pq.peek())) {
                pq.poll();
                pq.offer(num);
            }
        }
        for (int i = 0; i < k; i++) {
            ans[i] = pq.poll();
        }
        return ans;
    }
}

// 遍历HashMap可以使用forEach的lambda表达式
// map.forEach((key, value) -> {
//     if (pq.size() < k) {
//         pq.offer(key);
//     } else if (value > map.get(pq.peek())) {
//         pq.poll();
//         pq.offer(key);
//     }
// });