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

力扣215.数组中的第K个最大元素--堆排序法(java)

为了找到数组中第K个最大的元素,我们可以使用堆排序的方法。堆排序的核心是构建一个最大堆,并通过多次交换堆顶元素来找到前K个最大的元素。具体步骤如下:

方法思路

构建最大堆:将输入数组转换为最大堆,使得每个父节点的值大于其子节点的值。
交换并调整堆:执行K次交换操作,每次将堆顶元素(当前最大值)与当前堆的末尾元素交换,然后调整剩下的元素以维持最大堆的性质。
获取结果:经过K次交换后,第K个最大的元素会位于数组的倒数第K个位置。

解决代码

class Solution {
    class Heap{
        int size;
        int[] nums;
        public Heap(int[] nums){
            this.nums = nums;
            this.size = nums.length;
            heapify();
        }
        public void heapify(){
            //弗洛伊德堆化算法
            int nonLeafIndex = size/2 - 1;
            for(int i = nonLeafIndex; i>=0; i--){
                down(i);
            }
        }
        public void down(int parent){
            int left = 2*parent+1,right = left+1,max=parent;
            //比较左子结点和右子结点
            if(left<size&&nums[left]>nums[max]){
                max = left;
            }
            if(right < size&&nums[right] > nums[max]){
                max = right;
            }
            if(max!=parent){
                swap(nums,max,parent);
                down(max);
            }
        }
        public int poll(){
            int polled = nums[0];
            swap(nums, 0, size-1);
            size--;
            down(0); //调整堆结构
            return polled;
        }
        public void swap(int[] nums, int i, int j){
            int temp = nums[i];
            nums[i] = nums[j];
            nums[j] = temp;
        }
    }


    public int findKthLargest(int[] nums, int k) {
        Heap heap = new Heap(nums);
        //k=2
        while(k-- > 1){
            heap.poll();
        }
        return heap.poll();
    }
}

该方法的时间复杂度为O(n + k log n),其中构建堆的时间为O(n),每次调整堆的时间为O(log n),共进行k次调整。空间复杂度为O(1),因为所有操作都在原数组上进行。


文章转载自:

http://J1QbpcbU.spLkk.cn
http://y9IzOa5x.spLkk.cn
http://iuowgitE.spLkk.cn
http://YvIZsrDt.spLkk.cn
http://izW1WYIQ.spLkk.cn
http://M9gWOHT1.spLkk.cn
http://dJ96n2U9.spLkk.cn
http://b7ewAzAa.spLkk.cn
http://veG3YEGU.spLkk.cn
http://PQm2hfZn.spLkk.cn
http://b62TXwKX.spLkk.cn
http://a6MTchqP.spLkk.cn
http://GK5Awuzc.spLkk.cn
http://EjrvqHG3.spLkk.cn
http://jVX4rcEp.spLkk.cn
http://4PvEQ0F8.spLkk.cn
http://fJxDimxl.spLkk.cn
http://uGAwiplt.spLkk.cn
http://SasVgykS.spLkk.cn
http://nzZZ4oOz.spLkk.cn
http://1cneKCY6.spLkk.cn
http://UnC1etRo.spLkk.cn
http://Q8XsfjCk.spLkk.cn
http://gryJFBHH.spLkk.cn
http://MBHH8ylv.spLkk.cn
http://Im5TmWOO.spLkk.cn
http://hzARslNr.spLkk.cn
http://o7Jm9mc0.spLkk.cn
http://H5dADDmg.spLkk.cn
http://7Z1Sksf4.spLkk.cn
http://www.dtcms.com/a/66012.html

相关文章:

  • 透过安全事件看软件组成分析SCA
  • 26岁赵露思病好后大变样,穿披肩染奶奶灰意外惊艳,复工后美回巅峰
  • 专题|Python贝叶斯金融数据应用实例合集:随机波动率SV模型、逻辑回归、参数更新、绩效比较BEST分析亚马逊股票、普尔指数...
  • Linux 守护进程与 SSH 安全配置指南
  • 【草原之歌】:守护绿色的律动与《草原法》的力量
  • Practical Coding Function Design for Time-of-Flight Imaging文章解读,CVPR2019
  • 智能合约:Solidity(基于以太坊或兼容链,如 Polygon、BSC)(仅供学习区块链知识,不可进行违法开发应用)
  • 基于DeepSeek×MWORKS 2025a的ROM Builder自动化降阶实战
  • php将身份证号写入excel文件出现科学计数法问题解决
  • 详解CPU的组成与功能
  • leetcode hot100贪心
  • 使用自动导入后,eslint报错 eslint9
  • CCF CSP 第30次(2023.09)(1_坐标变换_C++)(先输入再计算;边输入边计算)
  • Xshell连接autodl时提示ssh服务器拒绝了密码,请再试一次
  • 【大模型学习】第十九章 什么是迁移学习
  • 微店关键词搜索商品详情API接口解析与应用
  • C++双端队列知识点+习题
  • ollama下载的DeepSeek的模型(Model)文件在哪里?(C盘下)
  • 【vue3学习笔记】(第144-146节)reactive函数;回顾vue2响应式原理;vue3响应式原理_proxy
  • 问deepseek: k-epsilon湍流模型,公式原理推导
  • 【基于ESP32-S3的多线程工业级温度监测系统】
  • 【业务场景实战】数据增量同步
  • 【计算机网络 第8版】谢希仁编著 第一章概述 课后题10、11、28、34解析
  • 使用 Arduino 和 ESP8266 Wi-Fi 模块发送电子邮件
  • python字符串练习题
  • 【QT】-一文读懂抽象类
  • 限流及熔断的场景?
  • 星越L_ 常规车门解锁方式讲解
  • C#中类‌的核心定义
  • git备份or打补丁