在未排序的数组中找到第 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)
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; } }