描述
有一个整数数组,请你根据快速排序的思路,找出数组中第K 大的数。
给定一个整数数组 ,同时给定它的大小n和要找的K ,请返回第 K大的数(包括重复的元素,不用去重),保证答案存在。
要求时间复杂度 0(n)
示例1
输入:
[1,3,5,2,2],5,3
返回值:
2
示例2
输入:
[10,10,9,9,8,7,5,6,4,3,4,2],12,3
返回值:
9
说明:
去重后的第3大是8,但本题要求包含重复的元素,不用去重,所以输出9
java代码:
import java.util.*;
public class Solution {
public int quicksort(int[] a,int left,int right,int K){
int l=left,r=right;
int key=a[left];
while(r>l){
while(a[r]>=key&&r>l){
r--;
}
a[l]=a[r];
while(r>l&&a[l]<=key){
l++;
}
a[r]=a[l];
}
a[l]=key;
//l为基准轴,l+1表示是数组中第l+1小的数
if(l+1==K) {
return a[l];
}
else if(l+1>K)
return quicksort(a,left,l-1,K);
else {
return quicksort(a,l+1,right,K);
}
}
public int findKth(int[] a, int n, int K) {
if(a.length<K) return 0;
//注意题目是寻找第K大的数,并不是第K小,排序的顺序从小到大的顺序,是第K小
//所以要转换 K1=n-K+1 ,转换成第K小
int value=quicksort(a,0,a.length-1,n-K+1);
return value;
}
}
java 题解2:
public class DemoTest {
public static void main(String[] args) {
//[10,10,9,9,8,7,5,6,4,3,4,2],12,3
int[] a={10,10,9,9,8,7,5,6,4,3,4,2};
int num=a.length;
int K=3;
int value=findKth(a, num, K);
System.out.println(value);
}
public static int quicksort(int[] a,int left,int right,int K){
int l=left,r=right;
int key=a[left];
while(r>l){
while(a[r]>=key&&r>l){
r--;
}
a[l]=a[r];
while(r>l&&a[l]<=key){
l++;
}
a[r]=a[l];
}
a[l]=key;
int min=l-left; //min表示比基准轴l小的数有min个数,min+1代表整个数组中第min+1小的数
if(min+1==K) {
return a[l];
}
else if(min+1>K) //基准轴落在了目标值k的右边,k值不变
return quicksort(a,left,l-1,K);
else {//基准轴落在了目标值k的左边,k值改变,k=k-min-1,表示右半边中相对于距离l+1的位置第k-min-1小的数
return quicksort(a,l+1,right,K-min-1);
}
}
public static int findKth(int[] a, int n, int K) {
if(a.length<K) return 0;
//注意题目是寻找第K大的数,并不是第K小,排序的顺序从小到大的顺序,是第K小
//所以要转换 K1=n-K+1 ,转换成第K小
int value=quicksort(a,0,a.length-1,a.length-K+1);
return value;
}
}