【剑指Offer面试题】 九度OJ1371:最小的K个数
来源:互联网 发布:用户生命周期算法 编辑:程序博客网 时间:2024/05/21 07:04
题目链接地址:
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
思路分析:
这题方法很多,也是面试容易问的问题。
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个数
- 剑指offer面试题30最小的k个数
- [剑指offer][面试题30]最小的k个数
- 【剑指offer】面试题30:最小的K个数
- 剑指Offer:面试题30 最小的k个数
- 剑指offer:面试题30,求最小的K个数
- 剑指offer 面试题30—最小的k个数
- 剑指offer 面试题30 最小的K个数
- 【剑指Offer学习】【面试题30:最小的k个数】
- 《剑指Offer》面试题:寻找最小的K个数
- 剑指offer-面试题30:最小的K个数
- 剑指offer-面试题30.最小的k个数
- 剑指offer之面试题30:最小的k个数
- 剑指offer之面试题30最小的k个数
- 剑指Offer----面试题30:最小的K个数
- 剑指offer-----面试题30(最小的k个数)
- 剑指offer面试题30:最小的K个数
- 剑指offer--面试题30:最小的K个数
- Jquery的提示插件 jquery.poshytip.js
- sql面试题详解
- 串讲2
- UIPageViewController 的简单使用
- 怎样将应用程序最小化到托盘?
- 【剑指Offer面试题】 九度OJ1371:最小的K个数
- nodejs之socket.io模块——实现了websocket协议
- oracle glogin.sql 和login.sql使用
- 导入他人项目问题
- PASSION之MAVEN工程详解
- Android LayoutInflater深度解析 给你带来全新的认识
- os.walk 目录遍历
- 算法练习
- php魔术方法__clone()的运作机制检测程序。