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

示例 1:

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

示例 2:

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

 

TopK的问题,思路就是用堆来解决。

先以前K个元素构建一个大小为K的小顶堆,然后从K个元素之后,遍历从索引在K后面的元素,如果有大于小顶堆的堆顶元素的,那么就交换两个元素并重新构建小顶堆。遍历到最后的小顶堆堆顶就是第K大的元素了。时间复杂度O(n+klogk)

数组中的第K个最大元素leetcode(Top K的问题)_代码

class Solution {
    public int findKthLargest(int[] nums, int k) {
        if(nums.length<k){
            return 0;
        }
        HeapSort(nums,k-1);
        return nums[0];
        
    }
    public void HeapSort(int nums[],int len){
        int i;        
        for(i=len/2;i>=0;i--){
            HeapAdjust(nums,i,len);
        }
        for(i=len+1;i<nums.length;i++){
            if(nums[0]<=nums[i]){                
                swap(nums,0,i);
                HeapAdjust(nums,0,len);
            }                
        }
   
    }
    public void HeapAdjust(int a[],int start,int len){
        int temp,j;
        temp=a[start];
        for(j=2*start;j<=len;j*=2){
            if(j<len&&a[j]>a[j+1])
                j++;
            if(temp<=a[j])
                break;
            a[start]=a[j];
            start=j;
        }
        a[start]=temp;
    }
    public void swap(int nums[],int a,int b){
        int tmp=nums[a];
        nums[a]=nums[b];
        nums[b]=tmp;
    }
}

数组中的第K个最大元素leetcode(Top K的问题)_代码