思路:转化为排序就可迎刃而解,排序中比较推荐的是快速排序,速度快,在快排时,每一次确定一个元素位置后比较当前index与k,如果相等直接返回,如果index大于k,则元素位于当前元素后面,再调用自身即可,index小于k与之同理
代码如下:
function findk(arr, k) {
let i = 0;
let j = arr.length-1;
let temp = arr[0];
while(i<j) {
while (i<j && arr[j] >= temp) {
j--;
}
arr[i] = arr[j];
i += 1;
while(i<j && arr[i] <= temp) {
i++;
}
arr[j] = arr[i];
j -= 1;
}
arr[i] = temp;
if(i == k-1) {
return arr[i];
}
if(i > k-1) {
return findk(arr.slice(0, i), k);
}
if(i < k-1) {
return findk(arr.slice(i+1, arr.length), k-1-i);
}
}
var arr = [10, 20, 5, 4, 201, 8, 32, 89, 21];
findk(arr, 4)
网友评论