最小k个数
题目
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
思考
- 方法0: 直接排序然后返回前k个,最好的时间复杂度为 O(nlog(n))
- 方法1: 快排的变种,时间复杂度 O(n),缺点:原址,需要把所有数都 load 到内存中
- 方法2: 利用最大堆作为辅助,时间复杂度 O(n*lg(k)),适用于处理数据量很大的情况。
code
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution{
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k){
vector<int> ans;
if(k > input.size()){
return ans;
}
// GetLeastNumbersPartition(input, 0, input.size()-1, k);
// for(int i=0; i<k; i++)
// ans.push_back(input[i]);
// return ans;
return GetLeastNumbersHeap(input, k);
}
// parition, average time complexity - O(n)
// note: k should less than then size of input
void GetLeastNumbersPartition(vector<int> &input, int left, int right, int k){
int pos = partition(input, left, right);
if(pos == k-1){
return;
}else if (pos < k-1){
GetLeastNumbersPartition(input, pos+1, right, k);
}else{
GetLeastNumbersPartition(input, left, pos-1, k);
}
}
int partition(vector<int> &input, int left, int right){
if(left > right)
return -1;
int pos = left-1;
for(int i=left; i<right; i++){
if(input[i] <= input[right]){
swap(input[i], input[++pos]);
}
}
swap(input[right], input[++pos]);
// input[left, pos] <= input[pos]
// input[pos+1, right] > input[pos]
return pos;
}
// heap sort, time complexity - O(nlog(k))
vector<int> GetLeastNumbersHeap(vector<int> &input, int k){
if(k > input.size() || input.empty())
return vector<int>();
vector<int> ans(input.begin(), input.begin()+k); // max heap
make_heap(ans.begin(), ans.end(), comp);
for(int i=k; i<input.size(); i++){
if(input[i] < ans.front()){ // the current value less than the maximun of heap
pop_heap(ans.begin(), ans.end(), comp);
ans.pop_back();
ans.push_back(input[i]);
push_heap(ans.begin(), ans.end(), comp);
}
}
sort(ans.begin(), ans.end());
return ans;
}
static bool comp(int a, int b){
return a<b;
}
};
int main()
{
freopen("in.txt", "r", stdin);
int k;
cin >> k;
vector<int> input;
int cur;
while(cin >> cur){
input.push_back(cur);
}
vector<int> ans = Solution().GetLeastNumbers_Solution(input, k);
for(int n : ans)
cout << n << " ";
cout << endl;
fclose(stdin);
return 0;
}
最小k个数的更多相关文章
- 求n个数中的最大或最小k个数
//求n个数中的最小k个数 public static void TestMin(int k, int n) { Random rd = new Ra ...
- nyoj 678 最小K个数之和
最小K个数之和 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 输入n个整数,输出其中最小的K个数之和.例如输入4,5,1,1,6,2,7,3,3这9个数字,当k=4 ...
- 最小K个数之和
描述 输入n个整数,输出其中最小的K个数之和.例如输入4,5,1,1,6,2,7,3,3这9个数字,当k=4,则输出最小的4个数之和为7(1,1,2,3). 输入 测试样例组数不超过10 每个测试案例 ...
- 算法试题 - 找出最小 k 个数
题目 题目:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 解析 思路1 这一题应用堆排序算法复杂度只有O(nlog k), ...
- 【13】堆排序 最小K个数
题目 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 收获 优先队列实现 (n1,n2)->n2-n1是 ...
- 剑指Offer28 最小的K个数(Partition函数应用+大顶堆)
包含了Partition函数的多种用法 以及大顶堆操作 /*********************************************************************** ...
- 找出最小的k个数
•已知数组中的n个正数,找出其中最小的k个数. •例如(4.5.1.6.2.7.3.8),k=4,则最小的4个数是1,2,3,4 •要求: –高效: –分析时空效率 •扩展:能否设计出适合在海量数据中 ...
- 编程算法 - 最小的k个数 红黑树 代码(C++)
最小的k个数 红黑树 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入n个整数, 找出当中的最小k个数. 使用红黑树(multiset) ...
- 笔试算法题(03):最小第K个数 & 判定BST后序序列
出题:输入N个整数,要求输出其中最小的K个数: 分析: 快速排序和最小堆都可以解决最小(大)K个数的问题(时间复杂度为O(NlogN)):另外可以建立大小为K的最大堆,将前K个数不断插入最大堆,对于之 ...
随机推荐
- 关于 HashMap 随笔
hashMap 的一些认识: 基于哈希表的Map接口的非同步实现,定义了键映射到值的规则 此实现提供所有可选的映射操作,并允许使用null值和null键 根据hash算法,确定key-value的存贮 ...
- POJ-2417-Discrete Logging(BSGS)
Given a prime P, 2 <= P < 2 31, an integer B, 2 <= B < P, and an integer N, 1 <= N &l ...
- PIC24 通过USB在线升级 -- USB HID bootloader
了解bootloader的实现,请加QQ: 1273623966 (验证填bootloader):欢迎咨询或定制bootloader; 我的博客主页www.cnblogs.com/geekygeek ...
- 简单Elixir游戏服设计-玩法simple_poker
上回介绍了玩法,现在编写了玩法的简单建模. 做到现在感觉目前还没有使用umbrella的必要(也许以后会发现必要吧),model 应用完全可以合并到game_server. 代码还在https://g ...
- NSString与NSMutableString的浅拷贝与深拷贝
浅拷贝:指针拷贝,指针与原指针地址相同,没有创建新的对象. 深拷贝:内容拷贝,创建了新的对象,指针地址与原对象的指针地址不同. NSString测试代码如下 打印结果如下(后面打印出的两个NSCFCo ...
- tomcat 内存大小配置
Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个java虚拟机.JAVA程序启动时JVM都会分配一个初始内存和最大内存给这个应用程序.这个初始内存和最大内存在一定程度都会 ...
- 从头编写 asp.net core 2.0 web api 基础框架 (4) EF配置
第1部分:http://www.cnblogs.com/cgzl/p/7637250.html 第2部分:http://www.cnblogs.com/cgzl/p/7640077.html 第3部分 ...
- 关于java的自动拆装箱若干细节问题
一.首先需要了解的几个前提: 1.自动装箱过程是通过调用valueOf方法实现的(如Integer.valueOf(10)),而拆箱过程是通过调用包装器的 xxxValue方法实现的(如Integer ...
- cocos2dx - 在MFC中使用cocos2dx
本节主要讲一下如何在MFC窗口中使用cocos2dx 在做比较复杂的游戏,有时需要通过一些工具来编辑生成关卡或者特效,技能等的配置文件.为了方便配置,需要可以通过修改参数直观得到显示的效果.这就需要将 ...
- win10 uwp 圆角按钮
本文讲的是如何做圆角按钮,我们在UWP本来的按钮都是矩形,圆角Radius没有,所以本文就用简单方法去做圆角按钮. 我们按钮需要圆角,而自带没有,其实做一个很简单,把原来的按钮变为背景透明,然后使用矩 ...