【快速选择算法】解决TopK问题中前K小的数字问题

server/2024/9/23 0:15:22/

在这里插入图片描述

目录

  • 1.前言
  • 2.题目简介
  • 3.求解思路
  • 4.示例代码

1.前言

在一个数组中找到这个数组前K小的数字有三种方式:

  • 排序 O(N*logN)
  • 堆排序:建立一个k个大小的大堆(如果是找前K大的数字的话用小堆) O(N*logK)
  • 快速选择算法:原地交换数字,使得该数组前k个数字就是该数组前K小的数字 一般情况接近O(N),最差情况O(N^2)

2.题目简介

题目链接:LINK
在这里插入图片描述

3.求解思路

在这里插入图片描述
在这里插入图片描述

4.示例代码

class Solution {
public:vector<int> inventoryManagement(vector<int>& nums, int k) {srand(time(nullptr));qsort(nums, 0, nums.size() - 1, k);return {nums.begin(), nums.begin() + k};}void qsort(vector<int>& nums, int begin, int end, int k){if(begin >= end) return;//数组分三块int key = GetRandom(nums, begin, end);int left = begin - 1, right = end + 1, i = begin;while(i < right){if(nums[i] < key){swap(nums[i++], nums[++left]);}else if(nums[i] == key){i++;}else //nums[i] > key{swap(nums[i], nums[--right]);}}//分情况讨论int a = left - begin + 1;int b = right - 1 - (left + 1) + 1;int c = end - begin + 1 - a - b;if(a >= k) qsort(nums, begin, left, k);else if(a + b >= k) return;else qsort(nums, right, end, k - a - b);}int GetRandom(vector<int>& nums, int begin, int end){return nums[rand() % (end - begin + 1) + begin];}
};

在这里插入图片描述


EOF


http://www.ppmy.cn/server/107393.html

相关文章

Dubbo源码解析之@DubboService、@DubboReference(Dubbo源码一)

更好的阅读体验&#xff1a;Dubbo源码解析之DubboService、DubboReference&#xff08;Dubbo源码一&#xff09; 视频讲解&#xff1a;https://www.bilibili.com/video/BV1nBsMejEbL 对于Dubbo用的最多的就是DubboService、DubboReference&#xff0c;与之对应的就是服务的提供…

高效的时间序列可视化:减少认知负荷获得更清晰的洞察

可视化时间序列数据是具有挑战性,尤其是涉及多个数据集时。精心设计的可视化不仅能清晰地传达信息,还能减少观察者的认知负荷,使其更容易提取有意义的洞察。 在本文中,我们将探讨使真实世界的疫苗接种数据来可视化单个时间序列和多个时间序列。 数据可视化中认知负荷的重要性 …

从etcd学习raft

在etcd的项目下有一个使用raft的示例&#xff0c;在之前读etcd代码的时候会比较难理解raft相关的代码。因此通过这个示例会更容易的了解raft相关的实现细节。 我将这部分代码推送到了我的git仓库&#xff1a;https://github.com/yugu2day/raftexample 在示例中&#xff0c;主…

NVIDIA将在Hot Chips 2024会议上展示Blackwell服务器装置

NVIDIA 将在 Hot Chips 2024 上展示其 Blackwell 技术堆栈&#xff0c;并在本周末和下周的主要活动中进行会前演示。对于 NVIDIA 发烧友来说&#xff0c;这是一个激动人心的时刻&#xff0c;他们将深入了解NVIDIA的一些最新技术。然而&#xff0c;Blackwell GPU 的潜在延迟可能…

字母的大小写转换(tolower、toupper、transform)

字母的大小写转换&#xff08;tolower、toupper、transform&#xff09; 1. tolower&#xff08;&#xff09;、toupper&#xff08;&#xff09;函数 &#xff08;这个在之前的一篇文章 “字符串中需要掌握的函数总结&#xff08;1&#xff09;”中有较为详细的介绍。&#…

解决 JS WebSocket 心跳检测 重连

解决 JS WebSocket 心跳检测 重连 文章目录 解决 JS WebSocket 心跳检测 重连一、WebSocket 心跳检测的作用二、心跳检测的处理方案1. 创建 WebSocket 连接2. 心跳参数设置3. 心跳检测逻辑4. 心跳包响应处理5. 断线重连机制 三、总结 一、WebSocket 心跳检测的作用 WebSocket 是…

【网络】网络层协议——IP协议

目录 1.TCP和IP的关系 2.IP协议报文 2.1. 4位首部长度&#xff0c;16位总长度&#xff0c;8位协议 2.2. 8位生存时间 &#xff0c;32位源IP地址和32位目的IP地址 3.IP地址的划分 3.1.IP地址的表现形式 3.2.旧版IP地址的划分 3.2.1.旧版IP地址的划分思路 3.2.2.分类划…

【虚拟化】KVM常用命令操作(virsh虚拟机常用操作之开关|连接|自启|克隆|快照)

目录 ​编辑一、KVM概述 1.1 KVM工具栈 1.2 libvirt架构概述 二、使用virsh管理虚拟机 三、kvm基本功能管理 1.帮助命令 2.KVM的配置文件存放目录 3.查看虚拟机状态 4.虚拟机关机与开机 5.强制虚拟机系统关闭电源 6.通过配置文件启动虚拟机系统 7.修改虚拟机配置文…