🤖
AI审核中

NC88 寻找第K大

文章摘要

本文介绍了 NC88 “寻找第 K 大” 的算法实现。题目要求在 O(n log n) 时间、O(1) 额外空间内,返回整数数组中第 K 大的元素(保留重复值)。示例说明了不去重的要求。提供了两种解法:① 直接使用 `Arrays.sort` 排序后取下标 `a[n‑K]`;② 利用最大堆(`PriorityQueue` 逆序)插入全部元素,弹出 K‑1 次后取堆顶。两种方法均满足题目复杂度限制。

题目链接:https://www.nowcoder.com/practice/e016ad9b7f0b45048c58a9f27ba618bf

题目描述

有一个整数数组,请你根据快速排序的思路(不一定比Arrays.sort()的性能好!),找出数组中第 k 大的数。

给定一个整数数组 a ,同时给定它的大小n和要找的 k ,请返回第 k 大的数(包括重复的元素,不用去重),保证答案存在。

要求:时间复杂度 O(nlogn),空间复杂度 O(1)

数据范围:0≤n≤10^5, 1≤K≤n,数组中每个元素满足 0≤val≤10^9

示例 1:

输入:[1,3,5,2,2],5,3
返回值:2

示例 2:

输入:[10,10,9,9,8,7,5,6,4,3,4,2],12,3
返回值:9
说明:去重后的第3大是8,但本题要求包含重复的元素,不用去重,所以输出9

解题代码

方法一(截图):
import java.util.*;

public class Solution {
    public int findKth(int[] a, int n, int K) {
        // write code here
        Arrays.sort(a);
        return a[n - K];
    }
}

方法二:
import java.util.*;

public class Solution {
    public int findKth(int[] a, int n, int K) {
        // write code here
        PriorityQueue<Integer> queue = new PriorityQueue<>((n1, n2) -> n2 - n1);
        while (n-- > 0) {
            queue.add(a[n]);
        }
        while (--K > 0) {
            queue.poll();
        }
        return queue.peek();
    }
}
0 条评论

如果你觉得文章对你有帮助,那就请作者喝杯咖啡吧

评论区 0

头像
 0 条评论