当前位置:网站首页>leetcode:215无序数组中找第k大的元素
leetcode:215无序数组中找第k大的元素
2022-08-04 14:31:00 【OceanStar的学习笔记】
题目来源
题目描述

题目解析
快排
原数组是要求第k大的问题可以转换为求第size - k + 1小的问题
思路
- 无序数组中随机选择一个数V,然后对V对整个数组做荷兰国旗问题。此后,<V的在左边,=V的在中间,>V的在右边
- 如果命中就停,如果没有命中,然后根据实际选择左侧或者右侧回到第一步
- 时间复杂度O(N)
实现
class Solution {
std::vector<int> partition(std::vector<int>& arr, int L, int R, int prio){
int less = L - 1, more = R + 1, curr = L;
while (curr < more){
if(arr[curr] < prio){
std::swap(arr[++less], arr[curr++]);
}else if(arr[curr] > prio){
std::swap(arr[curr], arr[--more]);
}else{
curr++;
}
}
return {
less + 1, more - 1};
}
// arr[L..R] 范围上,如果排序的话(不是真的去排序),找位于index的数
int process(std::vector<int> arr, int L, int R, int index){
if(L == R){
//
return arr[L];
}
int pivot = arr[rand() % (R - L + 1) + L];
auto range = partition(arr, L, R, pivot);
if (index >= range[0] && index <= range[1]) {
return arr[index];
} else if (index < range[0]) {
return process(arr, L, range[0] - 1, index);
} else {
return process(arr, range[1] + 1, R, index);
}
}
public:
int findKthLargest(vector<int> &nums, int k){
srand(time(0));
int result = 0;
int numsSize = int(nums.size());
if (numsSize == 0 || k > numsSize)
{
return 0;
}
//寻找第kMIN小的数
int kMin = numsSize - k + 1; //第k小
result = process(nums, 0, numsSize - 1, kMin - 1);
return result;
}
};
优先级队列
思路
- 唯一一个长度为k的小根堆,保持队列中的元素时钟为k个
- 遍历数组nums,入队一个元素之后,立即弹出堆顶最小的元素
- 遍历完成之后,堆顶的元素就是第k大的数字
ps:求第k大的数用小根堆,求第k小的数用大根堆
时间复杂度O(N*logK)
什么时候用?
在数据量很大的时候,可以实现「在线算法」,不用一下子把所有数据读入内存。
实现
class Solution {
public:
int findKthLargest(vector<int> &arr, int k){
std::priority_queue<int , std::vector<int>, std::greater<>> minheap;
for (int i = 0; i < k; ++i) {
minheap.push(arr[i]);
}
for (int i = k; i < arr.size(); ++i) {
if(arr[i] < minheap.top()){
minheap.pop();
minheap.push(arr[i]);
}
}
return minheap.top();
}
};
边栏推荐
- 量化细胞内的信息流:机器学习时代下的研究进展
- 谷歌插件.crx文件下载后被自动删除的解决方法
- 实际工作中的高级技术(训练加速、推理加速、深度学习自适应、对抗神经网络)
- 中大型商业银行堡垒机升级改造就用行云管家!必看!
- xampp安装包含的组件有(php,perl,apche,mysql)
- 技术分享| 融合调度系统中的电子围栏功能说明
- word2003按空格键为什么会出现小数点
- Kyushu Cloud attended the Navigator Online Forum to discuss the current status, challenges and future of 5G MEC edge computing
- LCP 06. 拿硬币-遍历
- 输入输出流总结
猜你喜欢

【模型部署与业务落地】基于量化芯片的损失分析

解题-->在线OJ(十八)

蓝牙技术|上半年全国新增 130 万台充电桩,蓝牙充电桩将成为市场主流

化算力为战力:宁夏中卫的数字化转型启示录

Centos7 install mysql version rapidly

在腾讯,我的试用期总结!

CCF GLCC正式开营|九州云开源专家携丰厚奖金,助力高校开源推广

token 过期后,如何自动续期?

Bluetooth Technology|In the first half of the year, 1.3 million charging piles were added nationwide, and Bluetooth charging piles will become the mainstream of the market

技术分享| 小程序实现音视频通话
随机推荐
SLAM 04.视觉里程计-1-相机模型
Execution failed for task ‘:xxx:generateReleaseRFile‘.
编程思想_编程有必要给孩子学吗?
关于redis的几件小事(五)redis保证高并发以及高可用
How to automatically renew the token after it expires?
【历史上的今天】8 月 4 日:第一位图灵奖女性得主;NVIDIA 收购 MediaQ;首届网络安全挑战大赛完成
职场漫谈:为什么越是内卷的行业越有人争着抢着往里冲?好奇怪的说...
兆骑科创创新创业大赛活动举办,线上直播路演,投融资对接
F.金玉其外矩阵(构造)
ACL 2022 | 社会科学理论驱动的言论建模
[The Art of Hardware Architecture] Study Notes (1) The World of Metastability
Win11快速助手在哪里?Win11打开快速助手的方法
NPDP|作为产品经理,如何快速提升自身业务素养?
阿里老鸟终于把测试用例怎么写说的明明白白了,小鸟必看
手搓一个“七夕限定”,用3D Engine 5分钟实现烟花绽放效果
从理论到实践:MySQL性能优化和高可用架构,一次讲清
token 过期后,如何自动续期?
Rust from entry to proficient 04-variables
Chinese valentine's day, of course, to learn SQL optimization better leave work early to find objects
Keycloak 6.0.0 正式发布,身份和访问管理系统