k最大的三种题解

一、排序出答案

空间复杂度(1)时间复杂度(nlogn)

import java.util.*;
public class Solution {
    
    public int findKth(int[] a, int n, int K) {
        // write code here
        Arrays.sort(a);
        return a[n-K];
        
    }
}

二、优先队列

空间复杂度(n)时间复杂度(nlogn)

import java.util.*;

public class Solution {
  
    public int findKth(int[] a, int n, int K) {
       PriorityQueue<Integer> que = new PriorityQueue<>();
		for(int i = 0; i < n;i++) {
			if(que.size()<K) {
				que.add(a[i]);
			}else if(a[i]>que.peek()) {
				que.remove();
				que.add(a[i]);
			}
		}	
		return que.peek();
    }
}

三、快速排序

空间复杂度(1) 时间复杂度(nlogn)

import java.util.*;

public class Solution {
    
    public void findKth(int[] a, int l, int r,int K){
        if(l>=r)return;
        int top = a[l];
        int i,j;
        
        i = l;j = r;
        while(i<j){
            while(i<j&&a[j]>top)j--;
            if(i<j)a[i++]=a[j];
            while(i<j&&a[i]<top)i++;
            if(i<j)a[j--]=a[i];
        }
        if(i==j)a[i] = top;
        if(i==K)return;
        else if(i<K)findKth(a,i+1,r,K);
        else findKth(a,l,i,K);
    }
    
    public int findKth(int[] a, int n, int K) {
      findKth(a, 0, n-1, n-K);
      return a[n-K];
    }
}