排序后,返回就行
var findKthLargest = function(nums, k) {
nums.sort((a,b)=>a-b)
return nums[nums.length - k]
};
- 在长度为n的排序数组中,第k大的数字的下标是n-k
- 用快速排序的函数partition对数组分区,如果函数partition选取的中间值在分区之后的下标正好是n-k,分区后左边的的值都比中间值小,右边的值都比中间值大,即使整个数组不是排序的,中间值也肯定是第k大的数字
- 如果函数partition选取的中间值在分区之后的下标大于n-k,那么第k大的数字一定位于中间值的左侧,于是再对中间值的左侧的子数组分区
- 如果函数partition选择的中间值在分区之后的下标小于n-k,那么第k大的数字一定位于中间值的右侧,于是再对中间值的右侧的子数组分区
function partition(arr, left, right) {
var pivot = arr[left];
var mark = left;
for (var i = left + 1; i <= right; i++) {
if (arr[i] < pivot) {
mark++;
[arr[mark], arr[i]] = [arr[i], arr[mark]];
}
}
arr[left] = arr[mark];
arr[mark] = pivot;
return mark;
}
var findKthLargest = function (nums, k) {
var targetIndex = nums.length - k;
var left = 0,
right = nums.length - 1;
var index = partition(nums, left, right);
while (index != targetIndex) {
if (index > targetIndex) {
right = index - 1;
} else {
left = index + 1;
}
index = partition(nums, left, right);
}
return nums[index];
};
console.log(findKthLargest([3,2,3,1,2,4,5,5,6],4));