题目链接地址:

http://ac.jobdu.com/problem.php?pid=1371

题目1371:最小的K个数

时间限制:1 秒内存限制:32 兆特殊判题:否提交:5938解决:1265

题目描写叙述:

输入n个整数,找出当中最小的K个数。比如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

输入:

每一个測试案例包括2行:

第一行为2个整数n。k(1<=n。k<=200000),表示数组的长度。

第二行包括n个整数。表示这n个数。数组中的数的范围是[0,1000 000 000]。

输出:

相应每一个測试案例。输出最小的k个数,并按从小到大顺序打印。

例子输入:

8 4

4 5 1 6 2 7 3 8

例子输出:

1 2 3 4


思路分析:

这题方法非常多,也是面试easy问的问题。

1. 快排后,取出前k个元素。

这种时间复杂度为O(nlogn+k),空间复杂度O(1)。

2. 用map直接统计每一个值出现的次数。

然后数出最小的k个值就可以。空间复杂度O(n)。

3. 採用小顶堆,n个元素建成一个小顶堆,将堆顶与数组的最后一个元素交换。这样最小的元素就保存在了数组的最后一个位置,k次调整后,最小的k个元素便保存在了数组的最后k个位置。时间复杂度为O(n+klogn);改变输入数组,空间复杂度为O(1),不改变输入数组空间复杂度为O(n)。

4. 用最大堆来存k个数,剩下的n-k个数每一个都和堆顶比較,比堆顶小时。就把堆顶元素替换掉。

採取先pop()后push()的方法替换。时间复杂度为O(k+(n-k)logk)。空间复杂度O(k)。(适合海量数据处理)


代码

方法四代码:

优先队列就是大顶堆。队头元素最大。

http://www.cppblog.com/darren/archive/2009/06/09/87224.html

/*********************************
【剑指Offer面试题】 九度OJ1371:最小的K个数
Author:牧之丶 Date:2015年
Email:bzhou84@163.com
**********************************/
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <cstring>
#include <math.h>
#include <stack>
#include <vector>
#include <queue>
#include <iostream>
#include<algorithm>
#include <map>
#include <queue>
using namespace std; int main()
{
// 大顶堆
priority_queue<int, vector<int>, less<int> > pQueue;
vector<int> result;
int n, k;
int i, tmp; while(scanf("%d%d", &n, &k)!=EOF){
while(!pQueue.empty()){
pQueue.pop();
}
result.clear(); if(k > n){
k = n;
}
for(i = 0; i < k; ++i){
scanf("%d", &tmp);
pQueue.push(tmp);
} for(i = k; i < n; ++i){
scanf("%d", &tmp);
if(tmp < pQueue.top()){
pQueue.pop();
pQueue.push(tmp);
}
} while(!pQueue.empty()){
result.push_back(pQueue.top());
pQueue.pop();
} for(i = (int)result.size() - 1; i >= 0; --i){
if(i == (int)result.size() - 1){
printf("%d", result[i]);
}else{
printf(" %d", result[i]);
}
}
printf("\n");
result.clear();
} return 0;
}
/**************************************************************
Problem: 1371
Language: C++
Result: Accepted
Time:980 ms
Memory:2292 kb
****************************************************************/

【剑指Offer面试题】 九度OJ1371:最小的K个数的更多相关文章

  1. 【剑指offer】求一组数据中最小的K个数

    题目:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. *知识点:Java PriorityQueue 调整新插入元素 转自h ...

  2. 《剑指offer》— JavaScript(29)最小的K个数

    最小的K个数 题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 思路一 使用JavaScript的Array对象的so ...

  3. 剑指Offer - 九度1371 - 最小的K个数

    剑指Offer - 九度1371 - 最小的K个数2013-11-23 15:45 题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是 ...

  4. 剑指Offer:面试题15——链表中倒数第k个结点(java实现)

    问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...

  5. 剑指offer——面试题15:二进制中 1的个数

    // 面试题15:二进制中1的个数 // 题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如 // 把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. #inc ...

  6. 剑指offer 面试题. 二叉搜索树的第k个结点

    题目描述 给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8)    中,按结点数值大小顺序第三小结点的值为4.     解: 由于二叉搜索树的中序遍历是升序,所以在中 ...

  7. 九度 1371 最小的K个数

    题目描述:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 输入: 每个测试案例包括2行:第一行为2个整数n,k(1<= ...

  8. 【剑指Offer面试题】 九度OJ1389:变态跳楼梯

    转自:http://www.myexception.cn/program/1973966.html 时间限制:1 秒内存限制:32 兆特殊判题:否提交:2331解决:1332 题目描述: 一只青蛙一次 ...

  9. 【剑指Offer面试题】 九度OJ1518:反转链表

    与其非常快写出一段漏洞百出的代码,倒不如细致分析再写出鲁棒的代码. 提前想好測试用例(输入非空等等)进行測试改动代码. 题目链接地址: http://ac.jobdu.com/problem.php? ...

随机推荐

  1. STM32使用HAL库实现ADC单通道转换

    STM32的ADC转换还是很强大的,它具有多个通道选择,这里我就不细说,不了解的可以自行百度,这里只是选取单通道,实现ADC转换.在文章开始之前,我说一下数据左对齐跟右对齐的差别,以前一直糊里糊涂的, ...

  2. java缓冲区BufferedReader

    1.java缓冲区BufferedReader拷贝文件 2.代码如下: package Demo1; import java.io.*; public class BufferedTest { pub ...

  3. MyBatis学习总结(18)——MyBatis与Hibernate区别

    也用了这么久的Hibernate和MyBatis了,一直打算做一个总结,就他们之间的优缺点说说我自己的理解: 首先,Hibernate是一个ORM的持久层框架,它使用对象和我们的数据库建立关系,在Hi ...

  4. Linux下的进程环境

    僵尸进程.孤儿进程.守护进程.进程组.会话.前台进程组.后台进程组 1,僵尸进程 子进程结束,父进程没有明确的答复操作系统内核:已收到子进程结束的消息.此时操作系统内核会一直保存该子进程的部分PCB信 ...

  5. (转)redis源代码分析 – event library

    每个cs程序尤其是高并发的网络服务端程序都有自己的网络异步事件处理库,redis不例外. 事件库仅仅包括ae.c.ae.h,还有3个不同的多路复用(本文仅描述epoll)的wrapper文件,事件库封 ...

  6. HTML---经常使用标签总结与实践

    什么是HTML? 超文本标记语言,标准通用标记语言下的一个应用.    "超文本"就是指页面内能够包括图片.链接,甚至音乐.程序等非文字元素. 超文本标记语言的结构包含" ...

  7. 拿到offer过后--大学最后时光最想做的那十件事

    昨天--2014.10.26,历史性的一刻,激动的签了欢聚时代(YY)的前端开发offer,工作地点是我喜欢的珠海(仅仅由于那边有我所向往的海还有自行车队,如今想想都乐开怀了,绕着海边骑单车的感觉真妙 ...

  8. cloudstack给已有zone加入物理网络

    默认情况下,假设zone建立完后.cloudstack是不提供加入物理网络接口的. 基础架构- 域 - 物理网络 以下仅仅有我们创建zone的时候加入的物理网络 假设想在这个基础上加入一个物理网络是没 ...

  9. Yii2高速构建RESTful Web服务功能简单介绍

    Yii2相比Yii1而言,一个重大的改进是内置了功能完备的RESTful支持. 其内置RESTful支持提供了例如以下功能: 使用ActiveRecord的通用接口来高速构建原型: 应答格式协商(缺省 ...

  10. fancybox关闭弹出窗体parent.$.fancybox.close();

    fancybox弹出窗体右上角会自带一个关闭窗体,而且点击遮罩层也会关闭fancybox 有时我们不须要这样进行关闭,隐藏关闭窗体,而且遮罩层不可点击 在弹出窗体页面加一链接进行关闭使用parent. ...