90 数组中的第K个最大元素

news2025/1/22 12:49:41

数组中的第K个最大元素

    • 题解1 最小堆(STL实现)
    • 题解2 快排的partition思想
    • 题解3 手撸大根堆(记忆+理解)
      • 参考link:

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

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

你必须设计并实现时间复杂度为 O ( n ) O(n) 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 <= 1 0 5 10^5 105
  • − 1 0 4 -10^4 104 <= nums[i] <= 1 0 4 10^4 104

题解1 最小堆(STL实现)

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        // 小根堆
        priority_queue<int, vector<int>, greater<int>> q;
        for(auto& i : nums){
            q.push(i);
            if(q.size() > k)
                q.pop();
        }
        return q.top();
    }
};

在这里插入图片描述

题解2 快排的partition思想

class Solution {
public:
    int quickSelect(vector<int>& nums, int l, int r, int k){
        if(l == r)
            return nums[k];
        int partition = nums[l];
        // 防止死循环
        int i = l-1;
        int j = r+1;
        while(i < j){
            do i++; while(nums[i] < partition);
            
            do j--; while(nums[j] > partition);
 
            if(i < j)
                swap(nums[i], nums[j]);
        }
        // 要找的下标比j小说明此时选择的在第k个数的右侧,递归左区间
        if(k <= j) 
            return quickSelect(nums, l, j, k);
        // 否则递归右区间
        else return quickSelect(nums, j+1, r, k);
    }
    int findKthLargest(vector<int>& nums, int k) {
        int s = nums.size();
        return quickSelect(nums, 0, s-1, s-k);
    }
};

在这里插入图片描述

题解3 手撸大根堆(记忆+理解)

大根堆就是根节点是整棵树的最大值(根节点大于等于左右子树的最大值),对于他的任意子树,根节点也是最大值。

参考link:

  1. java版本
  2. C++版本
class Solution 
{
public:
    int findKthLargest(vector<int>& nums, int k) 
    {
        int n = nums.size();
        // 先按层序构建堆的二叉树形
        build_maxHeap(nums);
        for (int i = 0; i < k - 1; i ++)
        {
        	// 0 <-> n-1
        	// 0 <-> n-2
        	//  ···
        	// 把每个数都换到头上试试
            swap(nums[0], nums[n-1-i]);
            // n - 2、n - 3 ... (视为依次插入元素)
            adjust_down(nums, 0, n-1-i - 1);
        }
        return nums[0];
    }


    void build_maxHeap(vector<int> & nums)
    {
    // 构建过程:
    /**
    	1. 设数组中从0到i-1位置的元素是一个大根堆, 把第i个位置的元素插入大根堆里
    	2. 为了符合大根堆的定义, 需要从第i个位置的元素开始,依次看它的父节点的值是否小于它
    	3. 如果小于就进行交换,直到它的父节点不小于它,或者到了该大根堆的最顶端的根节点,这一次过程才算彻底结束
    **/
        int n = nums.size();
        // 找到二叉树最后一个非叶子结点
        for (int root = n/2; root > -1; root --)
            adjust_down(nums, root, n - 1);
    }

    void adjust_down(vector<int> & nums, int root, int hi)
    {
        if (root > hi)
            return ;
        // 先记录下
        int t = nums[root];
        // 左孩子indice
        int child = 2 * root + 1;
        while (child <= hi)
        {
        	// 看最大的是不是右孩子
            if (child + 1 <= hi && nums[child] < nums[child + 1])
                child ++;
            // 不需要变动(父节点>子节点)
            if (t > nums[child])
                break;
            // 换,这里可以写swap函数
            nums[root] = nums[child];
            root = child;
            // 继续换
            child = 2 * root + 1;
        }
        nums[root] = t;
    }
};

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1165182.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

告别菜鸟!快速精通ER图的绝招在这里!

当涉及到数据管理和数据库设计时&#xff0c;实体-关系图&#xff08;ER图&#xff09;无疑是最重要的工具之一。他们在数据模型设计过程中发挥着举足轻重的作用。但是&#xff0c;理解ER图并不是一项容易的任务。如果你对ER图感到困惑&#xff0c;我们提供了这一全面的指南&am…

Java语法 - 01

Java基础 Java 是一种广泛使用的高级编程语言&#xff0c;最初由Sun Microsystems于1995年发布。它被设计为具有简单、可移植和面向对象的特性&#xff0c;以满足跨平台应用程序开发的需求。以下是一些关于 Java 的简介&#xff1a; 跨平台性&#xff1a;Java 程序可以在不同…

Java学习笔记(六)——面向对象编程(基础)

一、类与对象 &#xff08;一&#xff09;类与对象的概念 &#xff08;二&#xff09;对象内存布局 ​编辑 对象分配机制 ​编辑 &#xff08;三&#xff09;属性/成员变量 &#xff08;四&#xff09;创建对象与访问属性 二、成员方法 &#xff08;一&#xff09;方法…

全球互联网信息,中文内容只占1.3%,学好英语,这几条路子让你赚认知外的钱

在全世界的整个互联网上&#xff0c;中文内容只占1.3%&#xff0c;而英文内容接近60%&#xff0c;如果你不会英语&#xff0c;你的眼界和思维将局限在这1.3%里面。 单单就说赚钱这个事情&#xff0c;学好英语&#xff0c;你可以有很多特殊的路子赚到大钱&#xff0c;可以赚到你…

Vue纯CSS实现掷色子

效果图&#xff1a; 实现代码 直接利用CSS3动画实现的效果&#xff0c;无js代码。 <template><div class"wrap"><input type"checkbox" id"roll"><label for"roll"><div class"content"><…

安防监控项目---mjpeg-streamer视频图像显示(实时视频流实现)

文章目录 前言一、硬件准备和硬件设备的查询二、 jpeg库的移植2.1 源码下载2.2 jpeg库的移植三、mjpeg-stream的移植四、测试结果总结 前言 书接上期&#xff0c;我们已经实现了许多功能了&#xff0c;但是对于视频流的实时上传还未实现&#xff0c;本期主要分享的就是如何具体…

浅述青犀AI算法人体攀爬行为检测的应用场景及解决方案

人体攀爬行为检测是指利用计算机视觉技术对人类攀爬物体的行为进行识别和分析。该技术主要依靠图像和视频数据进行分析&#xff0c;通过识别人类身体的各个部位&#xff0c;以及其在攀爬过程中的动作和姿态&#xff0c;实现对攀爬行为的检测和跟踪。该技术的场景应用比较广泛&a…

Mac -- zsh-最新全网超详细的个性化终端(Terminal)颜色及vim颜色配置(亲测可行)

转自 Mac -- zsh-最新全网超详细的个性化终端(Terminal)颜色及vim颜色配置(亲测可行)_mac zsh-CSDN博客 以下都是苹果 设置&#xff0c;这是简化版的&#xff0c;详细的看我引用的 个性化终端颜色背景设置 显示检查器 打开终端&#xff0c;鼠标在终端中&#xff0c;右击&…

妙手ERP本期功能更新:TikTok支持自定义SKU规格、Temu支持创建尺码表、仓库库存可同步至Shopee全球产品 ......

为了给卖家朋友带来更好的使用体验&#xff0c;更高效地运营跨境店铺&#xff0c;妙手ERP在上周优化了以下多项功能。 01、产品模块优化 全平台 - 插件采集支持批量采集速卖通产品 - 店铺互踩、店铺产品增加销量筛选项 - 公用采集箱支持编辑产品父SKU、AI生成、SKU规格、尺码…

基于单片机设计的自动门控制系统

一、项目介绍 随着科技的不断发展&#xff0c;自动门成为公共场所、商业建筑和住宅社区等地的常见设施。自动门的出现使得进出门的操作更加便捷&#xff0c;提高了人们的生活质量和工作效率。为了实现自动门的开关控制&#xff0c;本项目基于单片机设计了一套自动门控制系统。…

Mac PS2023/2024储存窗口黑屏不显示 解决方法

mac 版本ps2023&#xff0c;存储为窗口突然显示为空白了&#xff0c;没有任何文字按钮&#xff0c;尝试过重启软件、重启电脑、重新安装、电脑系统更新&#xff0c;皆没有效果。 仅ps2023有这个bug&#xff0c;其他操作正常。 具体步骤: 1.打开finder, 先点击左边文稿, 再点击…

二维码智慧门牌管理系统:让房屋管理变得轻松高效!

文章目录 前言一、六实数据管理应用&#xff0c;让管理更精准二、快速导入导出&#xff0c;提升工作效率三、科技助力&#xff0c;让生活更美好四、适用广泛&#xff0c;满足各类需求 前言 随着科技的飞速发展&#xff0c;传统的房屋管理方式已经无法满足现代社会的需求。为了…

【Python语言】字符串的使用方法总结

目录 1、字符串的基本知识 2、字符串的常用操作 2.1 查找特定字符串的下标索引值 2.2 字符串的替换 2.3 字符串的分割 2.4 字符串的规整操作 2.5 统计字符串中某个字符串出现的次数 2.6 统计字符串的长度 3、字符串的遍历 3.1 while循环 3.2 for循环 1、字符串的基本…

cocosCreator微信小游戏 之 获取用户昵称、头像等信息(二)

版本&#xff1a; 3.4.0 语言&#xff1a; TypeScript 环境&#xff1a; Mac 简介 在上篇博客中&#xff0c;主要讲述内容&#xff1a;wx API在cocosCreator中配置定义文件和微信后台配置用户隐私相关。 讲述的主要原因是&#xff1a; cocosCreator没有对 wx API提供定义接…

链表的中间结点

题目表述 给你单链表的头结点 head&#xff0c;请你找出并返回链表的中间结点。如果有两个中间结点&#xff0c;则返回第二个中间结点。 这道题的思路是快慢指针&#xff0c;具体来说就是定义两个指针&#xff0c;一快一慢&#xff0c;快指针一次走两步&#xff0c;慢指针一次…

【每日一题】填充每个节点的下一个右侧节点指针 II

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;BFS 其他语言python3 写在最后 Tag 【BFS】【树】【2023-11-03】 题目来源 117. 填充每个节点的下一个右侧节点指针 II 题目解读 为二叉树中的每一个节点填充下一个节点。 解题思路 方法一&#xff1a;BFS 本题题目…

C 语言左移位操作在kernel驱动子系统中的特殊用途

文章目录 前言一、C语言左移位操作介绍1. 左移位二、左移位操作在kernel 驱动子系统中的应用1. 左移位操作在 V4L2, Media 子系统中的应用实例2.左移位操作在 DRM 子系统中的应用实例2.1 左移位操作在struct drm_crtc 中的应用2.2 左移位操作在struct drm_encoder 中的应用总结…

thinkphp6 入门(11)-- 模板标签

新版框架默认只能支持PHP原生模板&#xff0c;如果需要使用thinkTemplate模板引擎&#xff0c;需要安装think-view扩展&#xff08;该扩展会自动安装think-template依赖库&#xff09;。 composer require topthink/think-view配置文件 安装完成后&#xff0c;在配置目录的vi…

[AUTOSAR][诊断管理][ECU][$3E] 测试设备在线|会话保持

文章目录 一、简介二、服务请求报文定义三、肯定响应四、支持的NRC四、示例步骤(1)supportPosRspMsgIndicationBit=0(2)supportPosRspMsgIndicationBit=1三、示例代码3e_test_present.c一、简介 这个服务的目的是确保诊断服务或者之前激活的通信还处在激活的状态,可以保持…