ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LeetCode 215 Kth Largest Element in an Array 数组中的第K大元素

2022-07-22 04:00:22  阅读:153  来源: 互联网

标签:215 return nums 元素 Element Kth 区间 pivot left


描述

Given an integer array nums and an integer k, return the kth largest element in the array.

Note that it is the kth largest element in the sorted order, not the kth distinct element.

You must solve it in O(n) time complexity.

Example 1:

Input: nums = [3,2,1,5,6,4], k = 2
Output: 5
Example 2:

Input: nums = [3,2,3,1,2,4,5,5,6], k = 4
Output: 4

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/kth-largest-element-in-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

/**
 * 快速选择算法
 * 利用实现快排的思想,每次partition操作,pivot元素的位置总是可以被确认
 * 先将数组对于pivot逆序
 * 逆序之后,pivot的位置已经确定,此时分为两种情况
 * 1. k在基准值右边,k比pIndex小,递归右区间,右区间没有pivot和left的元素,因此查找所有数组中的第k大元素,变成了查找右区间的第k-left.length-1大的元素
 * 2. k在基准值左右,k比pIndex大,递归左区间,第k大元素在左区间依然是第k大元素,此时k位置不变
 * 3. k在基准值位置上,此时返回pivot即可
 * 这样做的好处就是把原来的快排需要递归两个区间,变成只递归一个区间, 同时引入随机化,避免有序数组的情况下时间复杂度为O(n²)
 * 最终时间复杂度为O(n)
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var findKthLargest = function (nums, k) {
    return quickSelect(nums, k - 1)
};


const quickSelect = (nums, kIndex, result) => {
    if (result != null) return result // 递归出口。pivot刚好落在第k大的元素上
    const left = []
    const right = []
    const pivot = nums.splice(Math.floor(Math.random() * nums.length), 1)[0]
    let pivotIndex = 0 // 排序后,pivot的索引位置
    // 基于pivot逆序
    for (let i = 0; i < nums.length; i++) {
        const v = nums[i]
        if (v > pivot) {
            left.push(v)
            pivotIndex++
            continue
        }
        right.push(v)
    }
    if (pivotIndex === kIndex) {
        return quickSelect(nums, kIndex, pivot)
    }

    // 逆序之后,分为两种情况
    // 1. k在基准值右边,k比pIndex小,递归右区间,右区间没有pivot和left的元素,因此查找所有数组中的第k大元素,变成了查找右区间的第k-left.length-1大的元素
    // 2. k在基准值左右,k比pIndex大,递归左区间,第k大元素在左区间依然是第k大元素,此时k位置不变
    return pivotIndex < kIndex ? quickSelect(right, kIndex - left.length - 1) : quickSelect(left, kIndex)
}

console.log(findKthLargest([3, 2, 1, 5, 6, 4], 2))

标签:215,return,nums,元素,Element,Kth,区间,pivot,left
来源: https://www.cnblogs.com/ltfxy/p/16504230.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有