目录
描述
有一个整数数组,请你根据快速排序的思路,找出数组中第 k 大的数。
给定一个整数数组 a ,同时给定它的大小n和要找的 k ,请返回第 k 大的数(包括重复的元素,不用去重),保证答案存在。
要求:时间复杂度 O(nlogn)O(nlogn),空间复杂度 O(1)O(1)
数据范围:0≤n≤10000≤n≤1000, 1≤K≤n1≤K≤n,数组中每个元素满足 0≤val≤100000000≤val≤10000000
示例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
思想:快速排序
代码
import java.util.*;
public class Solution {
public int findKth(int[] a, int n, int K) {
int target = n-K;
quickSort(a, 0, a.length-1, target);
return a[target];
}
public void quickSort(int[] a, int left, int right, int target){
if(left >= right) return;
int i = left;
int j = right;
int temp = a[left];
while(i < j){
while(i < j && a[j] >= temp) j--;
while(i < j && a[i] <= temp) i++;
swap(i, j, a);
}
swap(i, left, a);
if(i == target){
return;
}
quickSort(a, left, i-1, target);
quickSort(a, i+1, right, target);
}
public void swap( int m, int n,int[] a){
int temp = a[m];
a[m] = a[n];
a[n] = temp;
}
}