牛客热题:寻找第K大

news2024/9/24 7:21:19

📟作者主页:慢热的陕西人

🌴专栏链接:力扣刷题日记

📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言

在这里插入图片描述

文章目录

  • 牛客热题:寻找第K大
    • 题目链接
    • 方法一:使用C++内置sort
      • 思路
      • 代码
      • 复杂度
      • 空间复杂度
      • 总结
    • 方法二:优先队列
      • 思路
      • 代码
      • 复杂度
    • 方法三:快速选择算法
      • 思路
      • 代码
      • 复杂度

牛客热题:寻找第K大

题目链接

寻找第K大_牛客题霸_牛客网 (nowcoder.com)

方法一:使用C++内置sort

思路

代码

    template<typename T>
    struct greater
    {
        bool operator()(const T& a, const T& b)
        {
            return a > b;
        }
    };
    
    int findKth(vector<int>& a, int n, int K) 
    {
        sort(a.begin(), a.end(), greater<int>());
        return a[K - 1];
    }

复杂度

  • 时间复杂度

    • sort 函数使用的是 C++ 标准库中的快速排序(通常为 Timsort 或者是混合了快速排序、归并排序和插入排序的算法),其平均时间复杂度为 O( n l o g n n log n nlogn)。
    • 访问数组中的第 K 个元素的时间复杂度为 O(1)。

    综合起来,函数 findKth 的时间复杂度为:
    O( n l o g n n log n nlogn) + O(1) = O( n l o g n nlog n nlogn)

    空间复杂度

    • sort 函数需要额外的空间来进行排序。对于 Timsort,额外的空间复杂度为 (O(n))。
    • 代码中没有使用其他显著的额外空间,因此额外的空间主要来自排序算法本身。

    因此,函数 findKth 的空间复杂度为:
    [ O(n) ]

    总结

    • 时间复杂度: O( n l o g n nlog n nlogn)
    • 空间复杂度: O( n n n)

    这是因为 sort 函数在最坏情况下需要线性的额外空间,同时进行排序的平均时间复杂度为 O( n l o g n n log n nlogn)。

方法二:优先队列

思路

  • 定义比较器 greater:用于将优先队列构造成最小堆。
  • 初始化最小堆优先队列 pq
  • 遍历数组 a 中的每个元素:
    • 如果优先队列大小小于 K,直接推入元素。
    • 否则,比较当前元素与堆顶元素,替换堆顶元素。
  • 返回结果:优先队列顶部元素即为第 K 大的元素。

代码

template<typename T>
struct greater
{
    bool operator()(const T& a, const T& b)
    {
        return a > b;
    }
};

int findKth(std::vector<int>& a, int n, int K) 
{
    std::priority_queue<int, std::vector<int>, greater<int>> pq;
    
    for(auto& aa : a)
    {
        if (pq.size() < K) 
        {
            pq.push(aa);
        } 
        else if(aa > pq.top()) 
        {
            pq.pop();
            pq.push(aa);
        }
    }

    return pq.empty() ? -1 : pq.top();
}

复杂度

时间复杂度:O( n l o g K nlogK nlogK),优先队列的插入和替换堆顶都是O( l o g K logK logK)的时间复杂度

空间复杂度:O(K),我们要简历一个K个元素大小的堆

方法三:快速选择算法

思路

  1. Partition函数
    • 类似于快速排序的分区函数。选择最右边的元素作为枢纽(pivot)。
    • 遍历数组,将大于枢纽的元素移到左边,小于或等于枢纽的元素移到右边。
    • 返回枢纽的位置。
  2. QuickSelect函数
    • 递归地调用分区函数,并根据枢纽的位置与 K 比较,决定在哪个子数组继续查找。
    • 如果枢纽的位置等于 K,则找到了第 K 大的元素。
    • 否则根据 K 的位置选择继续在左子数组或右子数组查找。
  3. FindKthLargest函数
    • 调用 QuickSelect 函数来找到第 K 大的元素。注意传入的 K 需要减 1,因为数组索引从 0 开始。

代码

#include <vector>
#include <algorithm>

int partition(std::vector<int>& nums, int left, int right) {
    int pivot = nums[right];
    int i = left;
    for (int j = left; j < right; ++j) {
        if (nums[j] > pivot) {
            std::swap(nums[i], nums[j]);
            ++i;
        }
    }
    std::swap(nums[i], nums[right]);
    return i;
}

int quickSelect(std::vector<int>& nums, int left, int right, int K) {
    if (left == right) {
        return nums[left];
    }
    int pivotIndex = partition(nums, left, right);
    if (K == pivotIndex) {
        return nums[K];
    } else if (K < pivotIndex) {
        return quickSelect(nums, left, pivotIndex - 1, K);
    } else {
        return quickSelect(nums, pivotIndex + 1, right, K);
    }
}

int findKthLargest(std::vector<int>& nums, int K) {
    return quickSelect(nums, 0, nums.size() - 1, K - 1);
}

复杂度

  • 时间复杂度
    • 平均时间复杂度是 O(n),因为每次分区操作将数组划分成两部分。
    • 最坏情况下时间复杂度是 O( n 2 n^2 n2),当每次选择的枢纽总是最小或最大的元素时。
  • 空间复杂度
    • 空间复杂度是 O(1),因为是原地排序,没有使用额外的空间,递归调用的栈空间是 O( l o g n logn logn)(平均情况)。

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

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

相关文章

面试官:讲讲为什么SpringBoot的 jar 可以直接运行?

Spring Boot 是一个用于简化 Spring 应用程序开发的框架&#xff0c;它通过约定优于配置和大量的自动化配置&#xff0c;使得开发者可以更轻松地创建和部署 Spring 应用程序。一个特别引人注目的特性是 Spring Boot 应用可以打包成一个可执行的 JAR 文件&#xff0c;并且可以直…

基于图鸟UI的圈子商圈:一个全栈前端模板的探索与应用

摘要&#xff1a; 本文介绍了一个基于图鸟UI的纯前端模板——圈子商圈&#xff0c;它支持微信小程序、APP和H5等多平台开发。该模板不仅包含丰富的UI组件和页面模板&#xff0c;还提供了详尽的使用文档&#xff0c;旨在帮助开发者快速构建出酷炫且功能齐全的前端应用。本文将从…

51-54 Sora能制作动作大片还需要一段时间 | DrivingGaussian:周围动态自动驾驶场景的复合高斯飞溅

24年3月&#xff0c;北大、谷歌和加州大学共同发布了DrivingGaussian: Composite Gaussian Splatting for Surrounding Dynamic Autonomous Driving Scenes。视图合成和可控模拟可以生成自动驾驶的极端场景Corner Case&#xff0c;这些安全关键情况有助于以更低成本验证和增强自…

第14章-蓝牙遥控小车 手把手做蓝牙APP遥控小车 蓝牙串口通讯讲解

本文讲解手机蓝牙如何遥控小车&#xff0c;如何编写串口通信指令 第14章-手机遥控功能 我们要实现蓝牙遥控功能&#xff0c;蓝牙遥控功能要使用:1.单片机的串口、2.蓝牙通信模块 所以我们先调试好:单片机的串口->蓝牙模块->接到一起联调 14.1-电脑控制小车 完成功能…

乐游巴蜀,V你而来!苏州金龙海格新V系很“巴适”

成都&#xff0c;自古有“天府之国”之美誉&#xff0c;古老的城市人文与现代的摩登活力相交相融&#xff0c;加之令人垂涎的美食文化&#xff0c;共同造就了这里超强的旅游吸引力。2024年5月23日&#xff0c;以“用心前行&#xff0c;V你而来”为题的苏州金龙新V系客车推介会走…

摸鱼大数据——Hive表操作——基本操作

Hive表操作 Hive乱码解决 1、乱码现象 create database test1 comment "乱码测试"; use test1; CREATE TABLE orders ( orderId bigint COMMENT 订单id, orderNo string COMMENT 订单编号, shopId bigint COMMENT 门店id ); 2、处理步骤 注意&#…

关于研发过程中的代码版本控制的思考

文章目录 前言一、研发&#xff08;1&#xff09;分支管理&#xff08;2&#xff09;代码提交规范&#xff08;3&#xff09;版本号控制 二、测试&#xff08;1&#xff09;研发自测与用例评审研发自测测试人员测试 &#xff08;2&#xff09;BUG反馈与复测&#xff08;3&#…

HQL面试题练习 —— 合并数据

题目来源&#xff1a;京东 目录 1 题目2 建表语句3 题解 1 题目 已知有数据 A 如下&#xff0c;请分别根据 A 生成 B 和 C。 数据A ------------ | id | name | ------------ | 1 | aa | | 2 | aa | | 3 | aa | | 4 | d | | 5 | c | | 6 | aa…

【软件设计师】程序语言

1.程序设计语言基本概念 1.1 低级语言与高级语言 低级语言&#xff1a;机器语言和汇编语言称为低级语言 机器语言指0.&#xff0c;1组成的机器指令序列 汇编语言指用符号表示指令的语言&#xff0c;如MOV AX&#xff0c;2 高级语言&#xff1a;从人类的逻辑角度出发&#xff0…

WebGL在医学成像方面的应用

WebGL&#xff08;Web Graphics Library&#xff09;是一种用于在Web浏览器中呈现3D和2D图形的JavaScript API。它被广泛应用于各种领域&#xff0c;包括医学成像。以下是WebGL在医学成像方面的应用及其详细描述。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&…

蓝牙----wireshark抓包查看蓝牙通信过程

一.完整过程 二.过程详细分析 1.广播数据----可连接的无定向广播包&#xff1a;ADV_IND 2.广播数据----主动扫描&#xff1a;扫描请求&#xff08;SCAN_REQ&#xff09; 扫描相应&#xff08;SCAN_RSP&#xff09;3.被动扫描数据发送连接请求 4.蓝牙配对&#xff08;没有用到…

香橙派 AIpro开发板:开启AI视觉的无限可能

前言 在当今这个由数据和智能驱动的时代&#xff0c; 人工智能&#xff08;AI&#xff09; 已经成为推动技术创新和实现自动化的关键。 特别是在计算机视觉领域&#xff0c;AI的潜能被无限放大&#xff0c;它使得机器能够“看见”并理解视觉世界&#xff0c;从而执行复杂的任务…

企业内部通讯软件—WorkPlus适配信创即时通讯软件

在现代企业中&#xff0c;良好的内部通讯是保持高效工作和顺利运营的关键。企业内部通讯软件的选择对于提升沟通效率、促进团队合作、保障数据安全和隐私保护至关重要。本文将介绍企业内部通讯软件的重要性探讨一些常用的软件&#xff0c;帮助企业做出明智的选择。 一、企业内…

Java面试八股之synchronized关键字的作用

synchronized关键字的作用 同步与线程安全&#xff1a;synchronized是Java中的一个关键字&#xff0c;用于提供一种同步机制&#xff0c;确保线程安全。它通过在多线程环境中控制对共享资源的访问&#xff0c;防止数据的不一致性问题。 修饰代码块&#xff1a;当synchronized…

cuda 11.6 pytorch安装

在安装之前&#xff0c;需要先配置GPU环境&#xff08;安装CUDA和CudaNN) 命令行输入nvidia-smi&#xff0c;查看驱动信息 nvidia-smi 安装相应的CUDA 和CUDANN 验证&#xff1a;输入nvcc --version 或者nvcc -V 进行检查 nvcc --version nvcc -V 在anaconda里创建环境 co…

区间预测 | Matlab实现CNN-KDE卷积神经网络结合核密度估计多置信区间多变量回归区间预测

区间预测 | Matlab实现CNN-KDE卷积神经网络结合核密度估计多置信区间多变量回归区间预测 目录 区间预测 | Matlab实现CNN-KDE卷积神经网络结合核密度估计多置信区间多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CNN-KDE卷积神经网络结合…

武汉网红餐馆火灾背后的安全警示:可燃气体报警器需定期校准

在餐饮业快速发展的今天&#xff0c;安全问题一直是行业内外关注的重点。 最近&#xff0c;武汉一家网红餐馆在就餐高峰期突发火灾&#xff0c;事件迅速成为公众关注的焦点。这一事故不仅给餐馆带来了重大损失&#xff0c;也引发了对于餐馆安全管理的深思。 尤其是可燃气体报…

Unity学习日志

目录 获取相机可视范围的世界坐标(2D) 视口转世界坐标和屏幕转世界坐标的区别: 屏幕转世界坐标 视口转屏幕坐标 视口转屏幕结合3D数学实现可视范围的怪物生成 transform.up游戏对象的方向问题 其实还有一种不用Translate的写法: 修改 transform.up 的行为和影响 C#抽象…

OrangePi AIPro:次世代嵌入式边缘AI计算与智能机器人应用开发平台

近年来,随着物联网(IoT)和人工智能(AI)技术的快速发展,嵌入式边缘计算板卡在智能设备中的应用越来越广泛。OrangePi AIpro作为一款轻量化高性能的嵌入式边缘人工智能计算SoC,在硬件配置、AI性能和使用便利性方面都有着突出的表现。本文将详细评测OrangePi AIpro的各个方…