【每日一题】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]
    }
};

共勉

相关推荐
倒头就睡的小比特1 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!1 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼1 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光1 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark1 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her11 天前
并查集-听课笔记
笔记·算法·并查集
码流子2 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven2 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark2 天前
从算法设计模式看编程思维的抽象能力4
算法
2601_962218612 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法