分治算法(3)_快速选择_数组中的第K个最大元素

news2024/12/26 4:29:52

个人主页:C++忠实粉丝
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C++忠实粉丝 原创

分治算法(3)_快速排序_数组中的第K个最大元素

收录于专栏【经典算法练习】
本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论💌

目录

温馨提示:

1. top k问题

2. 题目链接

3. 题目描述

4. 解法(快速排序)

算法思路:

代码展示:

结果分析:


温馨提示:

该问题是top k问题的一类,top k问题可以使用堆排序和快速排序解决,因为题目要求使用O(N)的时间复杂度解决该问题,所以我这里就直接使用快速排序解决,想看堆排序的宝子们可以取下面的博客查看:

数据结构之二叉树的超详细讲解(2)--(堆的概念和结构的实现,堆排序和堆排序的应用)-CSDN博客 

1. top k问题

top k一共有4中类型:

1. 求数据中第k大的数

2. 求数据中第k小的数

3. 求前k大的数

4. 求前k小的数

top k问题在我们生活中还是比较常见的,比如在王者荣耀里面,你是济南市第九吕布,那么就需要系统找到济南市第九荣耀战力的吕布并将其信息打印出来,这样你就能看到你自己是济南市第九吕布了;又比如说:你不满足于济南市第九吕布,你想拿山东省第九吕布,但是你不知道山东省第九吕布的战力是多少,这个时候你就需要查询,山东省前一百吕布的战力,这时候就是top k100问题了

解决top k问题目前有两种方法:

1. 堆排序 时间复杂度O(NlogN)--(这个可以去上面我推荐的博客,讲解的很详细,初中数学知识就行)

2. 快速选择算法 时间复杂度O(N)--(这个的具体证明可以去看算法导论,我数学不太行!) 

2. 题目链接

OJ链接 :  数组中的第K个最大元素

3. 题目描述

给定整数数组 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

4. 解法(快速排序)

算法思路:

这里需要有(数组分三块,随机取key)快速排序的基础,如果还不知道的宝子们可以取看下面的博客:

分治算法(2)_快速排序_排序数组-CSDN博客 

在快排中,当我们把数组[分成三块]之后: [l, left][left + 1, right - 1][right, r], 我们可以通过计算每一个区间内的元素[个数],进而推断出我们要找的元素是在[哪一个区间]里面.

那么我们可以直接去[相应的区间]去寻找最终结果就好了.

 

代码展示:

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        srand(time(NULL));
        return qsort(nums, 0, nums.size() - 1, k);
    }

    int qsort(vector<int>& nums, int l, int r, int k)
    {
        if(l >= r) return nums[l];
        
        int key = getRandom(nums, l, r);
        int i = l, left = l - 1, right = r + 1;
        while(i < right)
        {
            if(nums[i] < key) swap(nums[++left], nums[i++]);
            else if(nums[i] == key) i++;
            else swap(nums[--right], nums[i]);
        }

        int b = right - left - 1;
        int c = r - right + 1;

        if(c >= k) return qsort(nums, right, r, k);
        else if(b + c >= k) return key;
        else return qsort(nums, l, left, k - b - c);
    }

    int getRandom(vector<int>& nums, int left, int right)
    {
        int r = rand();
        return nums[left + r % (right - left + 1)];
    }
};

结果分析:

在随机选择基准的情况下,期望的时间复杂度为 O(n)。这是因为在平均情况下,基准会将数组大致分成两半,这样每次递归将处理的元素数量减少大约一半。
由于每次递归的分区工作是线性的(O(n)),整个过程在期望情况下是 O(n) 的。 (具体的证明大家可以看算法导论)

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

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

相关文章

SSH -L 代理与反向代理转发详解

简介&#xff1a;SSH -L 选项用于设置本地端口转发&#xff0c;而反向代理转发则允许远程主机访问本地服务。本文将介绍如何使用 SSH -L 实现本地端口转发和反向代理转发&#xff0c;并提供示例以帮助您理解和应用这些技术。 历史攻略&#xff1a; Centos&#xff1a;设置代理…

国庆假期结束

&#x1f51a; 推迟几天返校 未提前和老师商量&#xff08;其实放假前我也说过的&#xff0c;但是我导可能忘记了&#xff09; 我的确有错&#xff0c;事情总自己觉得行了就觉得可以了 在老师看起来的确有点“不尊重” 下次一定要要要注意⚠️⚠️⚠️ 上次&#xff0c;国…

【Kubernetes】常见面试题汇总(五十九)

目录 129.问题&#xff1a;pod 使用 PV 后&#xff0c;无法访问其内容&#xff1f; 130.查看节点状态失败&#xff1f; 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff09;~&#xff08;二十二&#xf…

大语言模型 LLM 量化技术略解

什么是量化? 随着语言模型规模的不断增大,其训练的难度和成本已成为共识。而随着用户数量的增加,模型推理的成本也在不断攀升,甚至可能成为限制模型部署的首要因素。因此,我们需要对模型进行压缩以加速推理过程,而模型量化是其中一种有效的方法。 大语言模型的参数通常…

Python运行态 - 代码调试:掌握pdb

简介&#xff1a;pdb&#xff08;Python Debugger&#xff09;是 Python 标准库中的调试工具&#xff0c;旨在帮助开发者在代码中设置断点、检查变量值和逐行执行代码。这对于定位和修复程序中的问题至关重要。pdb 是 Python 的内置模块&#xff0c;因此不需要额外安装。 历史…

20款奔驰CLS300升级原厂抬头显示HUD 23P智能辅助驾驶 触摸屏人机交互系统

以下是为您生成的一份关于 18 款奔驰 CLS 老款改新款的改装文案&#xff1a; 18 款奔驰 CLS 老款改新款&#xff1a;科技升级&#xff0c;畅享极致驾驶体验 在汽车改装的世界里&#xff0c;每一次的升级都是对卓越的追求。今天&#xff0c;让我们一同探索 18 款奔驰 CLS 老款改…

Leetcode—152. 乘积最大子数组【中等】

2024每日刷题&#xff08;174&#xff09; Leetcode—152. 乘积最大子数组 C实现代码 class Solution { public:int maxProduct(vector<int>& nums) {int n nums.size();int mx nums[0];int mn nums[0];int ans mx;for(int i 1; i < n; i) {const int prem…

贪心算法c++

贪心算法C概述 一、贪心算法的基本概念 贪心算法&#xff08;Greedy Algorithm&#xff09;&#xff0c;又名贪婪法&#xff0c;是一种解决优化问题的常用算法。其基本思想是在问题的每个决策阶段&#xff0c;都选择当前看起来最优的选择&#xff0c;即贪心地做出局部最优的决…

基于yolov8的200鸟类智能检测与识别系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的200种鸟类智能检测与识别系统是一款基于深度学习的目标检测系统&#xff0c;该系统利用YOLOv8框架&#xff0c;通过11788张图片训练出一个能够进行鸟类智能检测与识别的模型&#xff0c;可以识别200种不同的鸟类。 该系统采用Python与PyQt5开发&…

苹果电脑磁盘满了怎么清理内存?必看清理秘籍

对于很多Mac用户来说&#xff0c;随着时间的推移&#xff0c;电脑逐渐变慢并出现磁盘空间不足的提示是一件非常头疼的事情。正确理解内存和存储的区别&#xff0c;并采用有效的清理方法&#xff0c;对于保持Mac性能至关重要。本文将深入探讨如何有效清理Mac上的磁盘空间&#x…

一文看懂计算机中的大小端(Endianess)

文章目录 前言一、什么是大小端二、如何判断大小端三、大小端的转换3.1 使用标准库函数3.2 手动实现大小端转换 前言 本文主要探讨计算机中大小端的相关概念以及如何进行大小端的判断和转换等。 一、什么是大小端 大小端&#xff08;Endianess&#xff09;是指计算机系统在存…

CentOS7安装宝塔

第一步&#xff1a;安装 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh安装成功后会弹出这个页面 那么下次怎样再次打开这个页面呢&#xff1f; 输入这个&#xff1a; /etc/init.d/bt default…

YOLO v1详解解读

&#x1f680; 在此之前主要介绍了YOLO v5源码的安装和使用&#xff08;YOLO v5安装教程&#xff09;&#xff0c;接下来将探索YOLO的实现原理&#xff0c;作为一个金典的单阶段目标检测算法&#xff0c;应该深度的理解它的构建思想&#xff1b;所以本系列文章将从LOVO v1出发到…

JavaEE: 深入解析HTTP协议的奥秘(1)

文章目录 HTTPHTTP 是什么HTTP 协议抓包fiddle 用法 HTTP 请求响应基本格式 HTTP HTTP 是什么 HTTP 全称为"超文本传输协议". HTTP不仅仅能传输文本,还能传输图片,传输音频文件,传输其他的各种数据. 因此它广泛应用在日常开发的各种场景中. HTTP 往往是基于传输层的…

PCIe配置篇(0)——地址空间

一、地址空间回顾 在最开始&#xff0c;我们先来回顾一下PCIe的一些基本概念&#xff0c;首先&#xff0c;PCIe是PCI的延伸&#xff0c;全名叫 Peripheral Component Interface Express。从名字就能看出&#xff0c;这是一种外设总线协议。在整个系统中&#xff0c;外设只是其中…

算法与程序课程设计——观光铁路

观光铁路 一、任务 跳蚤国正在大力发展旅游业&#xff0c;每个城市都被打造成了旅游景点。 许多跳蚤想去其他城市旅游&#xff0c;但是由于跳得比较慢&#xff0c;它们的愿望难以实现。这时&#xff0c;小C听说有一种叫做火车的交通工具&#xff0c;在铁路上跑得很快&#x…

C语言基础(10)之指针(2)

在上一篇文章中我们谈到了指针&#xff0c;并给老铁们讲解了什么是指针、指针类型、野指针以及指针运算等知识。在这篇文章中小编将继续带大家了解指针的相关知识点。 1. 指针和数组 指针和数组之间又能有什么联系呢&#xff1f;在谈这个之前&#xff0c;我们先来讲讲指针和数…

深入分析——为什么未初始化的全局变量是零?

1、前言 #include <stdio.h>int temp;int main(void) {//打印temp的值是零printf("temp%d\n", temp);return 0; }在C语言编程中&#xff0c;我们默认未初始化的全局变量、静态局部变量的初始化值都是零&#xff0c;底层原理如下 未初始化的全局变量、静态局部…

揭秘AI写作工具:如何改变内容创作新格局

小伙伴们&#xff0c;今儿咱们来聊聊那些个让人眼前一亮、脑洞大开的AI写作神器——笔灵AI写作、宙语AI写作、博思白板AI写作&#xff0c;还有讯飞星火&#xff0c;它们啊&#xff0c;简直就是文案人儿的超级辅助&#xff0c;让咱们写东西的时候&#xff0c;灵感嗖嗖地往外冒&a…

TinyOS -数据发布实验

文章目录 简介分析 简介 分发协议主要用于维护网络共享配置的一致性&#xff0c;这里的共享配置可以是节点传感器采样的周期、节点LPL醒睡的周期或者节点运行程序的映像等。每个节点都会维护一份这样的配置&#xff0c;分发协议负责通知每个节点这些配置的改变&#xff0c;并通…