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

给定整数数组 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 list = new ArrayList<>();
        Stack 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 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;
    }

你可能感兴趣的:(算法,数据结构)