刷题75 数组中第K个最大元素

70 阅读1分钟

给定整数数组 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

题解: 使用大根堆

调用:

class Solution {

public int findKthLargest(int[] nums, int k) {
    PriorityQueue<Integer>q=new PriorityQueue<>((o1,o2)->(o2-o1));
    for(int num:nums)
        q.add(num);
    int result=0;
    while(k--!=0){
        result=q.poll();
    }
    return result;
    }
}

实现大根堆:

 class Solution {
    public int findKthLargest(int[] nums, int k) {
                //大根堆
        int heapsize=nums.length;
        buildMaxheap(nums,heapsize);
        for(int i=nums.length-1;i>=nums.length-k+1;i--) {
            swap(0,i,nums);
            --heapsize;
            maxHeapify(nums,0,heapsize);
        }
        return nums[0];
    }
    public void  buildMaxheap(int []a,int heapsize){
        //建立一个大根堆
        for(int i=heapsize/2;i>=0;i--){
            //比较调整
            maxHeapify(a,i,heapsize);
        }
    }
    public void maxHeapify(int []a,int i,int heapsize){
        int l=i*2+1,r=i*2+2,largest=i;
        if(l<heapsize&&a[l]>a[largest]){
            largest=l;
        }
        if(r<heapsize&&a[r]>a[largest]){
            largest=r;
        }
        if(largest!=i){
            swap(largest,i,a);
            maxHeapify(a,largest,heapsize);
        }    
    }
    public void swap(int a,int b,int []arr){
        int temp=arr[a];
        arr[a]=arr[b];
        arr[b]=temp;
        }
}