当前位置: 首页 > news >正文

786. 第k个数

文章目录

  • Question
  • Ideas
  • Code

Question

给定一个长度为 n
的整数数列,以及一个整数 k
,请用快速选择算法求出数列从小到大排序后的第 k
个数。

输入格式
第一行包含两个整数 n
和 k

第二行包含 n
个整数(所有整数均在 1∼109
范围内),表示整数数列。

输出格式
输出一个整数,表示数列的第 k
小数。

数据范围
1≤n≤100000
,
1≤k≤n
输入样例:
5 3
2 4 1 5 3
输出样例:
3

Ideas

Code

// 快排步骤(O(nlgn)):
// 1.寻找分界点x,a[l + r >> 1]
// 2.划分区间,使得左边均<=x,右边均>=x
// 3.递归左右两边
// 快速搜索步骤(O(n))
// 当进行到第2步时,左区间严格<=右区间,所以第k小的数要么在左区间,要么在右区间,
// 只需要递归一边即可,这由k与左区间的元素个数有关#include <iostream>using namespace std;const int N = 1E5 + 10;
int a[N];int quick_choose(int *a, const int& l, const int& r, const int& k)
{if (l >= r) return a[l];int x = a[l + r >> 1];int i = l - 1, j = r + 1;while(i < j){do i ++; while(a[i] < x); // 快排左边寻找a[i] >= xdo j --; while(a[j] > x);if (i < j) swap(a[i], a[j]);}int sl = j - l + 1;if (k <= sl) return quick_choose(a, l, j, k); // 左边区间的数目else return quick_choose(a,j + 1, r, k - sl);
}
int main()
{int n, k;scanf("%d%d", &n, &k);for (int i = 0; i < n; i ++) scanf("%d", &a[i]);cout << quick_choose(a, 0, n - 1, k) << endl;return 0;
}
http://www.lryc.cn/news/121363.html

相关文章:

  • 用友-NC-Cloud远程代码执行漏洞[2023-HW]
  • Transformer(二)(VIT,TNT)(基于视觉CV)
  • Scratch 详解 之 线性→代数之——求两线段交点坐标
  • Python-组合数据类型
  • vue3+vue-simple-uploader实现大文件上传
  • 自适应变异麻雀搜索算法及其Matlab实现
  • ETL技术入门之ETLCloud初认识
  • uniapp项目如何运行在微信小程序模拟器上
  • 数据挖掘全流程解析
  • 详细介绍如何对音乐信息进行检索和音频节拍跟踪
  • Java课题笔记~ HTTP协议(请求和响应)
  • 在x86下运行的Ubuntu系统上部署QEMU用于模拟RISC-V硬件环境
  • 网络爬虫选择代理IP的标准
  • RxJava 复刻简版之三,map 多次中转数据
  • 06 Word2Vec模型(第一个专门做词向量的模型,CBOW和Skip-gram)
  • Axure RP9小白安装教程
  • 腾讯云CVM服务器2核2g1m带宽支持多少人访问?
  • 8.12学习笔记
  • 计算机体系中的不同的缓存存储层级说明
  • HCIP 链路聚合技术
  • 网页爬虫中常用代理IP主要有哪几种?
  • Js小数运算精度缺失的解决方法
  • 25 | 葡萄酒质量数据分析
  • 在 Windows 上安装 OpenCV – C++ / Python
  • 前后端交互开发模式yapi使用
  • Ajax同源策略及跨域问题
  • JavaScript:解构赋值【对象】
  • 微服务与Nacos概述-2
  • 解决MySQL与Redis缓存一致性的问题
  • 王道机组难题分析