当前位置: 首页 > article >正文

【leetcode】堆习题

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

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var findKthLargest = function(nums, k) {
    let arr = new MinHeap()
    nums.forEach(item => {
        arr.insert(item)
        if (arr.size() > k) {
            arr.pop()
        }
    })
    return arr.peek()
};

class MinHeap {
    constructor() {
        this.heap = []
    }
    // 换位置
    swap(i1, i2) {
        let temp = this.heap[i1]
        this.heap[i1] = this.heap[i2]
        this.heap[i2] = temp
    }
    // 找到父节点
    getParentIndex(index) {
        return Math.floor((index - 1) / 2)
    }
    // 上(前)移操作
    up(index) {
        if (index === 0) return
        const parentIndex = this.getParentIndex(index)
        if (this.heap[parentIndex] > this.heap[index] ) {
            this.swap( parentIndex, index )
            this.up(parentIndex)
        }
    }
    // 找到左侧子节点
    getLeftIndex(index) {
        return index * 2 + 1
    }
    // 找到右侧子节点
    getRigthIndex(index) {
        return index * 2 + 2
    }
    // 下(后)移操作
    down(index) {
        const leftIndex = this.getLeftIndex(index)
        const rightIndex = this.getRigthIndex(index)
        if (this.heap[leftIndex] < this.heap[index]) {
            this.swap(leftIndex, index)
            this.down(leftIndex)
        }
        if (this.heap[rightIndex] < this.heap[index]) {
            this.swap(rightIndex, index)
            this.down(rightIndex)
        }
    }
    // 添加元素
    insert( value ) {
        this.heap.push(value)
        this.up( this.heap.length-1 )
    }
    // 删除堆顶
    pop() {
        this.heap[0] = this.heap.pop()
        this.down(0)
    }
    // 获取堆顶
    peek() {
        return this.heap[0]
    }
    // 获取堆长度
    size() {
        return this.heap.length
    }
}

http://www.kler.cn/a/311415.html

相关文章:

  • 解决C盘空间不足的三种方案
  • WPF 应用程序中使用 Prism 框架时,有多种方式可以注册服务和依赖项
  • 即插即用篇 | YOLOv8 引入 代理注意力 AgentAttention
  • Elasticsearch中什么是倒排索引?
  • 移远通信亮相骁龙AI PC生态科技日,以领先的5G及Wi-Fi产品革新PC用户体验
  • android studio 配置过程
  • codetop哈希表刷题!!!刷穿地心版)
  • 如何使用ssm实现基于web的物流配送管理系统的设计与实现+vue
  • 【TabBar嵌套Navigation案例-关于页面 Objective-C语言】
  • FlexNet Licensing: not running 问题
  • IBM中国研发中心撤离背后的IT行业人才挑战与产业未来展望
  • web - JavaScript
  • .env文件详解(vite项目全局配置文件)
  • langchain报错记录(js)
  • node+express部署多套vue3项目,总404页面由node控制,子404页面由子vue控制,node路由重定向
  • 力扣 42.接雨水
  • MacOS Catalina 从源码构建Qt6.2开发库之01: 编译Qt6.2源代码
  • 机器学习-监督学习:朴素贝叶斯分类器
  • [C语言]第九节 函数一基础知识到高级技巧的全景探索
  • Python基础(九)——正则表达式
  • 软件工程中的耦合:类型、影响与优化策略
  • 索引的介绍
  • 【数据结构-差分】【hard】力扣995. K 连续位的最小翻转次数
  • 【RabbitMQ】重试机制、TTL
  • hku-mars雷达相机时间同步方案-软件驱动(MID360与海康MV-CB060-10UMUC-S)
  • 2-99 基于matlab多尺度形态学提取眼前节组织