215. 数组中的第K个最大值

发布时间:2024年01月04日

给定整数数组?nums?和整数?k,请返回数组中第?k?个最大的元素。

请注意,你需要找的是数组排序后的第?k?个最大的元素,而不是第?k?个不同的元素。

你必须设计并实现时间复杂度为?O(n)?的算法解决此问题。

示例 1:

输入: [3,2,1,5,6,4],
 k = 2
输出: 5

示例?2:

输入: [3,2,3,1,2,4,5,5,6], 
k = 4
输出: 4

提示:

  • 1 <= k <= nums.length <= 105
  • -104?<= nums[i] <= 104

方法1:? 简单方法用时少,第二个方法有的案例超时

    public static int findKthLargest(int[] nums, int k) {
//        方法1:
//        Arrays.sort(nums);
//        System.out.println(nums[nums.length - k]);
//        方法2:超时
        ArrayList<Integer> list = new ArrayList<>();
        Stack<Integer> stack = new Stack<>();
        for (int num : nums) {
            if (stack.size() == 0 || num > stack.peek()){
                stack.push(num);
            }else {
                while (stack.size() > 0 && num < stack.peek()){
                    list.add(stack.pop());
                }
                stack.push(num);
                int index = list.size() - 1;
                while (index >= 0){
                    stack.push(list.get(index--));
                    if (index == -1){
                        list.clear();
                    }
                }
            }
        }
        int index = 0;
        while (true){
            if (index == k - 1){
                break;
            }
            index++;
            stack.pop();
        }
        return stack.peek();
    }

方法2:

    public int findKthLargest(int[] nums, int k) {
        PriorityQueue<Integer> queue = new PriorityQueue<>((a, b) -> {
            return b - a;
        });
        for (int i : nums) {
            queue.add(i);
        }
        int result = 0;
        for (int i = 0; i < k; i++) {
            result = queue.poll();
        }
        return result;
    }

文章来源:https://blog.csdn.net/linping_wong/article/details/135395233
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。