有一个整数数组,请你根据快速排序的思路,找出数组中第 k 大的数。
给定一个整数数组 a ,同时给定它的大小n和要找的 k ,请返回第 k 大的数(包括重复的元素,不用去重),保证答案存在。
要求:时间复杂度
,空间复杂度
数据范围:
,
,数组中每个元素满足
有一个整数数组,请你根据快速排序的思路,找出数组中第 k 大的数。
[1,3,5,2,2],5,3
2
[10,10,9,9,8,7,5,6,4,3,4,2],12,3
9
去重后的第3大是8,但本题要求包含重复的元素,不用去重,所以输出9
function findKth( a , n , K ) {
// write code here
let b=a.sort((a,b)=>b-a)
return b[K-1]
} function findKth( a , n , K ) {
const arr = a.sort((a,b)=>b-a)
return arr[K-1]
}
module.exports = {
findKth : findKth
}; function findKth( a , n , K ) {
return a.sort((a,b)=>b-a)[K-1]
}
module.exports = {
findKth : findKth
}; function findKth( a , n , K ) {
function partion(a, lf, rt) {
const flag = a[lf]
while (lf < rt) {
while (a[rt] <=flag && lf < rt) rt--
if (lf < rt) a[lf++] = a[rt]
while (a[lf] > flag && lf< rt) lf ++
if (lf < rt) a[rt--] = a[lf]
}
a[lf] = flag
return lf
}
let lf = 0, rt = a.length - 1
let pivot = partion(a, lf, rt)
while (pivot !== K-1) {
if (pivot < K-1) {
lf = pivot+1
} else {
rt = pivot-1
}
pivot = partion(a, lf, rt)
}
return a[pivot]
} /**
*
* @param a int整型一维数组
* @param n int整型
* @param K int整型
* @return int整型
*/
function findKth( a , n , K ) {
// write code here
function quickSort (a, L, R) {
if (L >= R) return
let i = L
let j = R
let p = a[i]
while(i < j) {
while(i < j && a[j] >= p) {
j--
}
if(i < j) {
a[i++] = a[j]
}
while(i < j && a[i] < p) {
i++
}
if(i < j) {
a[j--] = a[i]
}
}
a[i] = p
quickSort(a, L,i - 1)
quickSort(a, i + 1, R)
}
quickSort(a, 0, a.length-1)
return a[n - K]
}
module.exports = {
findKth : findKth
}; function findKth( a , n , K ) {
// write code here
if(n==0 || K>n)
return [];
quickSort(a,0,n-1);
return a[n-K];
}
function quickSort(a, l, r){
if(l>=r) return;
let i=l, j=r, flag=a[i];
while(i<j){
while(i<j && a[j] > flag)
j--;
while(i<j && a[i] <= flag)
i++;
swap(a, i, j);
}
swap(a, i, l);
quickSort(a, l,i-1);
quickSort(a, i+1, r);
}
var swap = (a, i, j)=>{
if(a.length == 0) return;
let temp = a[j];
a[j] = a[i];
a[i] = temp;
};
module.exports = {
findKth : findKth
}; function findKth( a , n , K ) {
return quickfind(a, 0, n - 1, K);
}
function quickfind(a, left, right, k) {
let i = left, j = right, pivot = a[left];
while (i < j) {
while (i < j && a[j] >= pivot) j--;
if (i < j) a[i++] = a[j];
while (i < j && a[i] <= pivot) i++;
if (i < j) a[j--] = a[i];
}
a[i] = pivot;
const deltaK = k - right + i - 1;
if (deltaK === 0) return pivot;
else if (deltaK > 0) return quickfind(a, left, i - 1, deltaK);
else return quickfind(a, i + 1, right, k);
}