剑指 Offer II 076. 数组中的第 k 大的数字

136 阅读1分钟

剑指 Offer II 076. 数组中的第 k 大的数字

排序后,返回就行

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));

image.png