java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846  
 
 
 
文章目录  
 
 
 
 
  
解题思路:时间复杂度O( n n  n  ),空间复杂度O( l o g 2 n log_2{n}  l o g 2  n  ) 
 
 使用小根堆,建堆时间复杂度O(k),调整堆(删除堆顶并插入新元素)O( n ∗ l o g 2 k n*log_2k  n ∗ l o g 2  k  ),其中k是题目要求的返回第k最大元素。因此小根堆大小为k,故建堆为O(k). 共计O( k + n ∗ l o g 2 k k+n*log_2k  k + n ∗ l o g 2  k  ) = O(n) 不断地将元素插入到小根堆(根最小,其它元素都比根大)中,当堆中有k个元素,此时还需要往堆中插入元素时,需要进行判断。 因为此时堆顶元素正好是堆中倒数第k大元素。如果新插入元素比堆顶大。证明当前堆顶不是倒数第k大 则堆顶删除,并将新元素插入。此时调整堆,新的堆顶元素为第k大。以此类推。直到所有元素入堆后。 最终返回堆顶即可。   
  
堆排序https://blog.csdn.net/grd_java/article/details/136937525  
 
代码:当前官方增加了很多测试用例,已经无法超越100%的用户了,目前最快的算法,只能达到17ms,进行优化后,也只到了15ms。我查看2021年提交时的记录,是3ms超越100%。目前已经无法达到了。 
 
 使用Java提供的优先级队列实现小根堆(面试时候肯定不让你用。因此这个代码帮你理解整体的思路。然后第二个实现方法,我们需要自己实现小根堆)     
  
class  Solution  { public  int  findKthLargest ( int [ ]  nums,  int  k)  { PriorityQueue < Integer >   queue =  new  PriorityQueue < > ( new  Comparator < Integer > ( )  { @Override public  int  compare ( Integer  o1,  Integer  o2)  { return  o1 -  o2; } } ) ; for ( int  num: nums) { if ( queue. size ( )  ==  k) { if ( queue. peek ( )  <  num)  { queue. poll ( ) ; queue. offer ( num) ; } } else { queue. offer ( num) ; } } return  queue. poll ( ) ; } 
} 
  
 自己实现小根堆,因为Java自带容器加了很多健壮性和线程安全的逻辑,所以效率较慢,我们自己实现小根堆就会快很多。     
  
class  Solution  { public  int  findKthLargest ( int [ ]  nums,  int  k)  { int [ ]  minHeap =  new  int [ k] ; for  ( int  i =  0 ;  i <  k;  i++ )  { minHeap[ i]  =  nums[ i] ; } for  ( int  i =  k /  2  -  1 ;  i >=  0 ;  i-- )  { adjustHeap ( minHeap,  i) ; } for  ( int  i =  k;  i <  nums. length;  i++ )  { if  ( nums[ i]  >  minHeap[ 0 ] )  { minHeap[ 0 ]  =  nums[ i] ; adjustHeap ( minHeap,  0 ) ; } } return  minHeap[ 0 ] ; } private  void  adjustHeap ( int [ ]  array,  int  root)  { while  ( true )  { int  left =  2  *  root +  1 ; int  right =  left +  1 ; int  min =  root; if  ( left <  array. length &&  array[ left]  <  array[ min] )  min =  left; if  ( right <  array. length &&  array[ right]  <  array[ min] )  min =  right; if  ( min ==  root)  break ; swap ( array,  root,  min) ; root =  min; } } private  void  swap ( int [ ]  array,  int  i,  int  j)  { int  temp =  array[ i] ; array[ i]  =  array[ j] ; array[ j]  =  temp; } 
}