【每日一题】LeetCode 215. 数组中的第K个最大元素 TypeScript

CodeTop 面试题目总结

215. 数组中的第K个最大元素

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

复制代码
输入: [3,2,1,5,6,4], k = 2
输出: 5

示例 2:

复制代码
输入: [3,2,3,1,2,4,5,5,6], k = 4
输出: 4

提示:

  • 1 <= k <= nums.length <= 105
  • -104 <= nums[i] <= 104

快速排序(超时)

TypeScript 复制代码
function findKthLargest(nums: number[], k: number): number {
    const n = nums.length
    const target = n - k
    const quickSort = (num: number[], left: number, right: number, target: number): number => {
        if(left>=right) return num[left]
        //随机生成下标作为基准
        const randomIndex = left + Math.floor(Math.random() * (right - left + 1));
        const stand = num[randomIndex];
        //交换至最右边    注意:;分号别忘了,不然报错
        [num[right], num[randomIndex]] =[num[randomIndex], num[right]];
        let storeId = left

        for (let i = left; i < right; i++) {
            if (num[i] < stand) {
                [num[i], num[storeId]] = [num[storeId], num[i]]
                storeId++
            }
        }
        [num[storeId], num[right]] = [num[right], num[storeId]]
        if (storeId === target) {
            return num[storeId]
        } else if (storeId < target) {
            return quickSort(num, storeId + 1, right, target)
        } else {
            return quickSort(num, left, storeId - 1, target)
        }
    }
    return quickSort(nums, 0, n - 1, target)
};

还不如暴力解法🙄

TypeScript 复制代码
function findKthLargest(nums: number[], k: number): number {
    nums.sort((a,b)=>b-a)
    return nums[k-1]
};

最终通过版

1.随机下标,把数组分成三部分:

left\[\]:大于随机下标的数

right\[\]:小于随机下标的数

equal\[\]:等于随机下标的数

【类似降序】

2.第k大,是从左往右第k大的元素

k的值小于等于left.length=>证明k在左边left\[\]数组里面

k的值大于left.length + equal.length =>证明k在右边right\[\]数组里面

都不符合以上两种,就是equal\[\]里,取0下标就行

TypeScript 复制代码
function findKthLargest(nums: number[], k: number): number {
    const left:number[] = []
    const right:number[] = []
    const equal:number[] = []

    let rand = Math.floor(Math.random()*nums.length)

    for(let i=0;i<nums.length;i++){
        const cur = nums[i]
        if(cur>nums[rand]){
            left.push(cur)
        }else if (cur < nums[rand]){
            right.push(cur)
        }else{
            equal.push(cur)
        }
    }
    if(k<=left.length){
        return findKthLargest(left,k)
    }else if(k>left.length + equal.length){
        return findKthLargest(right,k-left.length-equal.length)
    }else{
        return equal[0]
    }
};

共勉

相关推荐
ZoeLandia3 小时前
TypeScript 05:交叉类型、索引签名、元组与 enum
前端·typescript
行者全栈架构师4 小时前
【鸿蒙心迹】冷启动从 2.8s 优化到 0.9s——耗时拆解与数据对比实战(HarmonyOS 7.x)
前端·算法·架构
LXY_BUAA4 小时前
《嵌入式操作系统》_framebuffer驱动_20261008
linux·运维·算法
Logic1014 小时前
C语言/数据结构字符串题解:统计“chhc“子串权值总和——一次遍历模式匹配
c语言·数据结构·算法·字符串·时间复杂度·空间复杂度·ascii
java_nnnn4 小时前
LeetCode刷题滑动窗口(最大连续1的个数三+将x减到0的最小操作数)Java
算法·leetcode·职场和发展
bnmoel4 小时前
C++ 基础入门篇(六)类和对象-第三篇:运算符重载
开发语言·c++·算法·语法·运算符重载
wuyk5554 小时前
28 搜索引擎索引更新:从 LSM Tree 到布隆过滤器的高效实现
stm32·单片机·嵌入式硬件·算法
我命由我123454 小时前
LRU 缓存淘汰策略
数据结构·redis·学习·mysql·算法·缓存·学习方法
垆边人似月.5 小时前
华为题:合并区间
数据结构·c++·算法
垆边人似月.5 小时前
华为题:滑动窗口最大值
数据结构·c++·算法