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

双指针法(双路快速排序法)

class Solution {
    public int findKthLargest(int[] nums, int k) {

        /**
         * 第k大的元素等同于第length - k小的元素
         */
        int target = nums.length - k;
        return sort(nums, 0, nums.length - 1, target);
    }

    public int sort(int[] nums, int left, int right, int target){

        int p = partition(nums, left, right);

        if (p == target){
            return nums[p];
        }
        else if (p < target){
            return sort(nums, p + 1, right, target);
        }
        else {
            return sort(nums, left, p - 1, target);
        }
    }

    /**
     * 双指针遍历数组,将小于第一个元素的放在左边,大的放在右边
     * 这样该元素就是第p小的元素,如果p == target就找到目标
     */
    public int partition(int[] nums, int left, int right){

        int i = left + 1;
        int r = right;
        int temp = 0;

        while (i <= r){

            if (nums[i] <= nums[left]){
                i++;
            }
            else {

                temp = nums[r];
                nums[r] = nums[i];
                nums[i] = temp;
                r--;
            }
        }

        temp = nums[left];
        nums[left] = nums[r];
        nums[r] = temp;

        return r;
    }
}


/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(logn)
 */

优先队列

import java.util.PriorityQueue;

public class Algorithm {

    public static void main(String[] args) {

        int[] arr = {3,2,3,1,2,4,5,5,6};
        System.out.println(new Solution().findKthLargest(arr, 4));
    }
}

class Solution {
    public int findKthLargest(int[] arr, int k) {

        /**
         * 寻找最大的第k个元素
         * 先将前k个元素放进堆中,然后将后面的元素和堆的最小值进行比较,如果比最小值大,说明这个最小值不是目标元素,就删除它,直到找到最大的k个元素
         * Java默认的优先队列,使用的就是最小堆
         */
        PriorityQueue<Integer> heap = new PriorityQueue();

        for (int i = 0; i < k; i++) {
            heap.add(arr[i]);
        }

        for (int i = k; i < arr.length; i++) {

            if (arr[i] > heap.peek()) {

                heap.poll();
                heap.add(arr[i]);
            }
        }

        return heap.peek();
    }
}

https://leetcode-cn.com/problems/kth-largest-element-in-an-array/

posted @ 2021-10-24 14:43  振袖秋枫问红叶  阅读(51)  评论(0)    收藏  举报