题目描述

在上一回里我们知道Nettle在玩《艦これ》,Nettle的镇守府有很多船位,但船位再多也是有限的。Nettle通过捞船又出了一艘稀有的船,但是已有的N(1≤N≤1,000,000)个船位都已经有船了。所以Nettle不得不把其中一艘船拆掉来让位给新的船。Nettle思考了很久,决定随机选择一个k,然后拆掉稀有度第k小的船。 已知每一艘船都有自己的稀有度,Nettle现在把所有船的稀有度值告诉你,希望你能帮他找出目标船。

输入

第1行:2个整数N,k。N表示数组长度,

第2行:N个整数,表示a[1..N],保证不会出现重复的数,1≤a[i]≤2,000,000,000。

输出

第1行:一个整数t,表示t在数组中是第k小的数,若K不在数组中,输出-1。

样例输入

10 4

1732 4176 2602 6176 1303 6207 3125 1 1011 6600

样例输出

1732

算法

无意间刷到这题,并且原题已经给出算法的提示。趁着这题让我回顾了下快速排序,并且在这边先记录这题算法的核心思想。

快速排序每次都能确定一个元素的位置,也就是说,能知道这个元素是数组中第几小的数。那么将k与该元素所在的位置进行比较:
如果正好就是第k小的数,直接打印退出即可;
如果该位置比k大,说明第k小的数在该元素左边的那堆数中,往左边走,重复之前的步骤;
如果该位置比k小,说明第k小的数在该元素右边的那堆数中,往右边走,重复之前的步骤。 由于不是进行全局的交换位置,每次都交换需要寻找的区域,所以时间复杂度为O(logn);但是当遇见一开始就完全有序的情况,或者是从大到小排序的情况就比较蛋疼,所以最后能放置一个标志位,如果一轮下来不曾交换可以直接通过数学的方法计算出第k小的位置。当然,这是在本题中这么说,如果真实的快排中,选择主元是一门比较大的学问。 当然这题也可以用堆排序实现,维护一个N-k这么大的最小堆,最后的堆顶就是需要找的元素,说实话借助优先队列的话,还是十分简单的。

代码

#include <iostream>
using namespace std; void Swap(int &a, int &b)
{
int tmp = a;
a = b;
b = tmp;
} int main()
{
// freopen("stdin.txt", "r", stdin);
int N, k;
scanf("%d %d", &N, &k);
int Arr[N];
for (int i = 0; i < N; i++)
{
scanf("%d", &Arr[i]);
}
if (k < 1 || k > N)
printf("-1\n"); // 算法主体
int left = 0, right = N-1;
while(left <= right)
{
int pivot = Arr[left];
int p = left, q = right;
while (1)
{
while (Arr[q] >= pivot && q > p)
q--;
while (Arr[p] <= pivot && p < q)
p++;
if (p < q)
swap(Arr[p], Arr[q]);
else
break;
} Swap(Arr[left], Arr[p]);
// for (int f = 0; f < N; f++)
// cout << Arr[f] << ' ';
// cout << endl; if(p == k-1)
{
printf("%d\n", Arr[p]);
break;
}
else if (p > k-1)
right = p - 1;
else
left = p + 1;
}
return 0;
}

【hihoCoder】#1133 : 二分·二分查找之k小数的更多相关文章

  1. hihoCoder 1133 二分·二分查找之k小数(TOP K算法)

    #1133 : 二分·二分查找之k小数 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回里我们知道Nettle在玩<艦これ>,Nettle的镇守府有很 ...

  2. hiho week 37 P1 : 二分·二分查找之k小数

    P1 : 二分·二分查找之k小数 Time Limit:10000ms Case Time Limit:1000ms Memory Limit:256MB 描述 在上一回里我们知道Nettle在玩&l ...

  3. 查找第K小数

    题目描述 查找一个数组的第K小的数,注意同样大小算一样大. 如  2 1 3 4 5 2 第三小数为3. 输入描述: 输入有多组数据.每组输入n,然后输入n个整数(1<=n<=1000), ...

  4. 【九度OJ】题目1174:查找第K小数 解题报告

    [九度OJ]题目1174:查找第K小数 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1174 题目描述: 查找一个数组的第 ...

  5. 【HIHOCODER 1133】 二分·二分查找之k小数

    描述 在上一回里我们知道Nettle在玩<艦これ>,Nettle的镇守府有很多船位,但船位再多也是有限的.Nettle通过捞船又出了一艘稀有的船,但是已有的N(1≤N≤1,000,000) ...

  6. hiho一下 第三十七周 二分查找之k小数

    题目链接:http://hihocoder.com/contest/hiho37/problem/1 , 简单二分. 算法: 题目即为求一个无序数组数组中第k小的数,由于数据量太大,排序是会超时的. ...

  7. hihoCoder#1133 二分·二分查找之k小数

    原题地址 经典问题了,O(n)时间内找第k大的数 代码: #include <iostream> using namespace std; int N, K; int *a; int se ...

  8. Hiho : 二分·二分查找之k小数

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回里我们知道Nettle在玩<艦これ>,Nettle的镇守府有很多船位,但船位再多也是有限的.Nettl ...

  9. hihocoder1133 二分·二分查找之k小数

    思路: 类似于快排的分治算法. 实现: #include <iostream> #include <cstdio> #include <algorithm> #in ...

随机推荐

  1. my simplest kv db

    最简单的kv db 最基本的网络连接 使用STL map存储key value 作为多线程互斥的简单例子. 以后有机会逐步优化添加功能 1增加ASIO 异步通讯 2优化存储空间 传递指针 避免过多的拷 ...

  2. Matching Networks for One Shot Learning

    1. Introduction In this work, inspired by metric learning based on deep neural features and memory a ...

  3. 重写comparater比较器

    TreeSet 能自动对对象进行排序,但是一般需要在类中重写比较方法 比较器介绍 在类中实现Comparable接口,并重写compareTo方法 排序对象类 package typing.overr ...

  4. [uboot] (番外篇)uboot之fdt介绍

    http://blog.csdn.net/ooonebook/article/details/53206623 以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为 ...

  5. spring与junit整合测试

    1.导包4+2+aop+test 2.配置注解 3.测试

  6. mysql数据库到底是什么?!

    MySql是MySql.AB公司开发的,采用客户/服务器模型的开放源码关系型SQL数据库管理系统,它可以在多种操作系统上运行. 客户端/服务器:C/S.需要给不同系统安装不同的软件,是专用的协议,比较 ...

  7. 【repost】学JS必看-JavaScript数据结构深度剖析

    JavaScript以其强大灵活的特点,被广泛运用于各种类型的网站上.一直以来都没怎么好好学JS,只是略懂皮毛,看这篇文章时有读<PHP圣经>的感觉,作者深入浅出.生动形象地用各种实例给我 ...

  8. js 基本

    JavaScrip组成:1.ECMAScrip --核心2.DOM 文档对象模型3.BOOM 浏览器对象模型 JavaScrip写法分类:1.内联式写在标签内以属性为表现:2.内嵌式以script标签 ...

  9. 消息中间件——RabbitMQ

    RabbitMQ介绍 RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性.扩展性.高可用性等方面表现不俗.RabbitM ...

  10. Android-普通变量与普通方法内存图

    描述Worker对象: package android.java.oop11; // 描述Worker public class Worker { public String name; public ...