最大 / 小的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 ...
随机推荐
- android asmack 注册 登陆 聊天 多人聊天室 文件传输
XMPP协议简介 XMPP协议(Extensible Messaging and PresenceProtocol,可扩展消息处理现场协议)是一种基于XML的协议,目的是为了解决及时通信标准而提出来的 ...
- Python实现CART(基尼指数)
Python实现CART(基尼指数) 运行环境 Pyhton3 treePlotter模块(画图所需,不画图可不必) matplotlib(如果使用上面的模块必须) 计算过程 st=>start ...
- 从JetBrains公司产品给我的商业模式启示
JetBrains是捷克一家公司,专门从事IDE工具的开发,运营的产品有十几个.我因为使用JavaScript IDE工具而了解了WebStorm.进而了解了开发WebStorm的公司JetBrian ...
- springboot注解
@RestController和@RequestMapping注解 我们的Example类上使用的第一个注解是 @RestController .这被称为一个构造型(stereotype)注解.它为阅 ...
- java 参数化类型
package com.gxf.collection; import java.util.LinkedList; public class TestForT<T> { private Li ...
- JavaScript深复制
转载:http://blog.csdn.net/wanmingtom/article/details/7988284 这原本是StackOverFlow里的一个提问,看到答案后受益良多,于是翻译一下下 ...
- Android -- 分享功能和打开指定程序
打开指定程序 Intent intent ...
- 找出1-N中1的个数
一.题目 给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数. 要求: 写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数.例如 f(12) = 5. ...
- Chrome控制台输入多行js
Chrome控制台输入多行js 分类: chrome2013-09-08 09:40 342人阅读 评论(0) 收藏 举报 控制台 Chrome控制台中回车默认是执行,要想输入换行,应按Enter+S ...
- android 通过socket获取IP
如题<android 通过socket获取IP>: socket.getInetAddress().getHostAddress();