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

//1.使用最小堆,或最大堆
// 根据 k 的不同,选最大堆和最小堆,目的是让堆中的元素更小
class Solution {
    public int findKthLargest(int[] nums, int k) {
        PriorityQueue<Integer> queue = new PriorityQueue<>();
        for(int num : nums){
            queue.add(num);
            //如果队列的容量已经超过 K个,那么弹出堆顶元素,内部的元素由堆来调整
            if(queue.size() > k){
                queue.poll();
            }
        }
        return queue.peek();
    }
}

 

//2.使用快排
class Solution {
    public int findKthLargest(int[] nums, int k) {
        int len = nums.length;
        int left = 0;
        int right = len - 1;

        int target = len - k;
        while(true){
            int index = partition(nums,left,right);
            if(index == target){
                return nums[index];
            }else if( index < target){
                left = index + 1;
            }else{
                right = index - 1;
            }
        }   
    }
    public int partition(int[] nums,int left,int right){
        // pivot为基准位
        int pivot = nums[left];
        int j = left;
        for(int i = left + 1;i <= right;i++){
            if(nums[i] < pivot){
                //小于 pivot 的元素 都被交换到前面
                j++;
                swap(nums,j,i);
            }
        }
        //在之前的遍历过程中,满足[left+1,j] < pivot, 并且(j,i] >= pivot
        swap(nums,j,left);
        //交换以后 [left,j - 1] < piovt , nums[j] = piovt,[j + 1,right] >= piovt
        return j;
    }
    //交换nums[i] 与 nums[j]的位置
    public void swap(int[] nums,int i,int j){
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}

 

posted @ 2020-11-01 21:16  peanut_zh  阅读(94)  评论(0编辑  收藏  举报