最大 / 小的K个数
在《剑指offer》上看到的,而且Qunar去年的校招笔试也考了这题,今天晚上去西电腾讯的宣讲会,来宣讲的学长也说他当时一面的时候面试官问了“一亿个数据的最大的十个数”的面试题。今晚就写写最大 / 最小 的K个数的解题思路吧!
第一次见这个类型的题应该就是看Qunar的去年的校招笔试题,题目好像是一亿个数据,输出最大的100个数据。当时脑子里面的第一个想法就是维护一个100个数据的升序 / 降序数组,然后开始对数据开始一个一个的遍历,比较。然后就觉得自己好傻,那样肯定时间复杂度不行。后来看到的一种借助快速排序的划分的思想的解法和另一种借鉴堆排序的思想的解法。
类快速排序的解法就是选取一个数作为轴来划分数据,比它大的都放在右边,比它小的都放在左边,当这个数据的索引刚好是K的时候,则它前面的K个数刚好就是最小的数据。
时间复杂度为O(n),而且只有当我们可以修改数据位置的时候才能用。
代码如下
int partition(int *arr,int lo,int hi)
{
//随机化的快速排序,避免O(n^2)
swap(arr[lo],arr[lo+rand()%(hi-lo+)]);
int pivot = arr[lo];
while(lo<hi)
{
while(lo<hi && arr[hi]>=pivot)
--hi;
arr[lo] = arr[hi]; while(lo<hi && arr[lo]<=pivot)
++lo;
arr[hi] = arr[lo];
}
arr[lo] = pivot;
return lo;
} void GetMinKNumber(int *In,int n,int *Out,int k)
{
int start = ;
int end = n;
int index = partition(In,,n);
while(index!=k-)
{
if (index > k-)
{
end = index;
index = partition(In,start,end);
}
else
{
start = index;
index = partition(In,start,end);
}
}
for (int i=;i<k;Out[i]=In[i],i++);
} int main()
{
int arr[] = {,,,-,};
int n = sizeof(arr)/sizeof(int);
int *p = new int[];
GetMinKNumber(arr,n,p,);
for (int i=;i<;i++)
{
cout<<p[i]<<endl;
}
return ;
}
另一种借助堆排序的思想,时间复杂度为O(nlogk) ,不用改变数据位置,等我看完堆排序再来填坑。。。。。
最大 / 小的K个数的更多相关文章
- 算法进阶面试题02——BFPRT算法、找出最大/小的K个数、双向队列、生成窗口最大值数组、最大值减最小值小于或等于num的子数组数量、介绍单调栈结构(找出临近的最大数)
第二课主要介绍第一课余下的BFPRT算法和第二课部分内容 1.BFPRT算法详解与应用 找到第K小或者第K大的数. 普通做法:先通过堆排序然后取,是n*logn的代价. // O(N*logK) pu ...
- [剑指Offer]40-最小的k个数
题目链接 https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf?tpId=13&tqId=11182&t ...
- 寻找最大(小)的K个数
<<编程之美>>一书中提到了寻找最大的K个数的问题,问题可以简单描述为:在长度为N的数组中,寻找第K(K<N)个最大的数.问题的解法涉及到了很多排序算法,对我们理解和运用 ...
- 华为OJ2051-最小的K个数(Top K问题)
一.题目描述 描述: 输入n个整数,输出其中最小的k个. 输入: 输入 n 和 k 输入一个整数数组 输出: 输出一个整数数组 样例输入: 5 2 1 3 5 7 2 样例输出: 1 2 二.Top ...
- 剑指offer系列55---最小的k个数
[题目] 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. *[思路]排序,去除k后的数. package com.exe11 ...
- 剑指offer---最小的K个数
题目:最小的K个数 要求:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. class Solution { public: ...
- 剑指offer-最小的K个数-时间效率-排序-python
题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 这就是排序题(将结果的最小K值输出) # -*- coding ...
- 剑指offer-面试题40-最小的k个数-最大堆
/* 题目: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. */ /* 思路: 利用最大堆,C++中使用multiset& ...
- JZ-029-最小的 K 个数
标题 最小的 K 个数 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 题目链接: 最小的 K 个数 代码 import ja ...
随机推荐
- GestureDetector.OnGestureListener
为了加强鼠标响应事件,Android提供了GestureDetector手势识别类.通过GestureDetector.OnGestureListener来获取当前被触发的操作手势(Single Ta ...
- Android的一些常用命令提示符(cmd)指令
在<Android基础之用Eclipse搭建Android开发环境和创建第一个Android项目>中我曾介绍过如何给Android SDK配置环境变量,现在它就有用武之地了,我们可以直接在 ...
- pcre 使用
1.主页地址:http://www.pcre.org/ 下载pcre-7.8.tar.bz22.解压缩: tar xjpf pcre-7.8.tar.bz23.配置: cd p ...
- ios学习笔记之block在ios开发中的应用
一.什么是Blocks Block是一个C级别的语法以及运行时的一个特性,和标准C中的函数(函数指针)类似,但是其运行需要编译器和运行时支持,从ios4.0开始就很好的支持Block. 二. ...
- Altera USB Blaster 仿真器(EPM240仿制版
转载:http://tigerwang202.blogbus.com/logs/35981280.html 其他很好的资料:http://bbs.ednchina.com/BLOG_ARTICLE_1 ...
- 1.1 MySQL 逻辑架构
- AlarmManager使用注意事项
在使用AlarmManager实现闹钟需要注意的是,intent和pendingintend的context如果是activity,那么当activity回收之后,context对象则不能被Alarm ...
- OS X 使用技巧——在Finder窗口标题栏上显示路径
Finder窗口默认显示当前文件夹的名称或当前所在的模式(例如AirDrop).如果想要显示路径(用User/[当前用户账号名称]/Documents 替代以前显示的Documents),打开终端并运 ...
- 2014ACM/ICPC亚洲区鞍山站 清华命题
A http://acm.hdu.edu.cn/showproblem.php?pid=5070 先跳过. B http://acm.hdu.edu.cn/showproblem.php?pid=50 ...
- sqlserver 查询库中有多少张表
表数目:select count(1) from sysobjects where xtype='U' 视图数::select count(1) from sysobjects where xtype ...