算法学习(八)求给定区间的第k小(大)数
来源:互联网 发布:国产睡眠耳塞知乎 编辑:程序博客网 时间:2024/06/09 23:16
前面有关于求数组的第k小的数和topk的讨论,这么再加上一个限定条件,限定求给定区间。
题目描述:
给定一个数组a[],给定区间2-5,求区间内第3小的数。
分析:
这个其实就是对a[2…5]内得数求第k小的数,和前面的关于数组第k小的数的求法是一致的,快排,选择排序,维护k个元素的最大堆。
如果对于这个数组要求多次求不同区间内得第k小的数,是不是每次都要重新排序,有木有每次都是O(N)的方法
提出使用伴随数组的解法,利用数组下标来建立伴随数组。
定义一个结构体,一个是数组元素,另一个是数组原来的标号,记录每个数组的原顺序。
a[i].data 1 5 2 6 3 7 4
a[i].num 1 2 3 4 5 6 7
给定下标区间2-5,找到区间第3小的数,
对原数组进行排序,
a[i].data 1 2 3 4 5 6 7
a[i].num 1 3 5 7 2 4 6
现在数据现在已经从小到大排序好了,我们只需要去检索,从数组开头检索,当我们发现下标在给定的下标区间内,就k–,那么当k==0的时候,我们就找到了第k小的数了。这个伴随数组,让我们后来遍历的时候能识别这个数是不是在给定的下标区间中的某一个数。
#include <algorithm>#include <iostream>#include <stdio.h>using namespace std;struct node{ int num ,data; bool operator < (const node & p) const { return data < p.data; }};node p[10001];int main(){ int n= 7; int i,j,a,b,c; for(i =1;i<=n;i++) { scanf("%d",&p[i].data); p[i].num = i; } sort(p+1,p+1+n); scanf("%d %d %d",&a,&b,&c); for(i = 1;i<=n;i++) { if(p[i].num >= a && p[i].num <= b) c--; if(c == 0) break; } cout << p[i].data << endl; return 0;}
对于多次查找给定区间的第K小的数,使用伴随数组的方法,只需要排序一次,每次检索都是根据伴随数组来查找。
0 0
- 算法学习(八)求给定区间的第k小(大)数
- 求数组中给定下标区间内的第K小(大)元素
- 查找给定区间内第K大/小的数
- 第三章再续:伴随数组求数组中给定下标区间内的第K小(大)元素
- 划分树(基本用法是求给定区间的第k大的值)
- 寻找给定区间内的第k小(大)的元…
- 寻找给定区间内的第k小(大)的元素
- 划分树的学习(求区间第k大的数字)&&分块求区间第k大
- 程序员编程艺术:三之三续、求数组中给定下标区间内的第K小(大)元素
- 程序员编程艺术:三之三续、求数组中给定下标区间内的第K小(大)元素
- 程序员编程艺术:三之三续、求数组中给定下标区间内的第K小(大)元素
- 程序员编程艺术:三之三续、求数组中给定下标区间内的第K小(大)元素
- 【算法题】BFPRT算法:求第K小或者第K大的数
- 关于在指定区间求第k小的数,求高效率算法
- 区间元素可变(添加与删除)的第求k大数和给定数的排名问题
- 【算法】求第k大的数
- POJ 2761-Feed the dogs(划分树)求区间内第k小的数
- poj 2761 多种数据结构算法求区间第k大的数
- WebApp简单制作
- TCP/IP协议 卷一 -----------广播和多播
- 第6章 任务执行
- Java多线程之使用volatile优雅地实现单例
- eclipse加速之禁用JS、jsp等文件的语法验证,eclipsejs
- 算法学习(八)求给定区间的第k小(大)数
- linux 函数 sendto recvfrom
- 安卓的常用组件
- 基于JQuery、Jsonp与Jersey的跨域访问
- 剑指offer:不用加减乘除做加法
- SaaS营销网站的剖析之案例Slack
- ejs模板中的四种表达式输出形式
- 分布式系统中的进程通信
- dubbo管理控制台安装和使用