最小的k个数
// 最小的k个数.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <iostream>
#include <set>
#include <vector>
#include <queue>
using namespace std; // set中默认是从大到小的顺序,即最先取出的是最小值
// 此处为从小到大,最先取出的是最大值
typedef multiset<int,greater<int>> inSet;
typedef multiset<int,greater<int>>::iterator setIterator; // 基于红黑树
void GetNumber(vector<int> &data,inSet &leastNumber,int k)
{
if(k<= || data.size()==)
return ;
leastNumber.clear();
vector<int>::iterator it = data.begin();
for(;it!=data.end();++it)
{
if(leastNumber.size()<k)
leastNumber.insert(*it);
else{
setIterator s = leastNumber.begin(); if(*it < *s)
{
leastNumber.erase(s);
leastNumber.insert(*it);
}
}
}
setIterator s = least.begin();
for(;s!=least.end();++s)
cout<<*s<<" ";
cout<<endl;
} // 基于优先队列
void GetNumber2(vector<int> &data,int k)
{
if(data.size()== || k<)
return ;
// top取出的是最小值,即是按从大到小排列的
//priority_queue<int,vector<int>,greater<int>> q;
// 默认是从小到大排列,即最先取出的是最大值
priority_queue<int> q;
vector<int>::iterator it = data.begin();
for(;it!=data.end();++it)
{
if(q.size()<k)
q.push(*it);
else{
if(*it < q.top())
{
q.pop();
q.push((*it));
}
}
}
while(q.size()>)
{
cout<<q.top()<<" ";
q.pop();
}
cout<<endl;
} int Partition(int *a,int start,int end)
{
if(start < end)
{
int i=start,j=end;
int x = a[start];
while(i<j)
{
while(i<j && a[j]>x)
j--;
if(i<j)
a[i++] = a[j];
while(i<j && a[i]<x)
i++;
if(i<j)
a[j--] = a[i];
}
a[i] = x;
return i;
}
} // 基于分治思想,但会修改数组,时间复杂度为O(N)
void GetNumber2(int *a,int len,int k)
{
if(a==NULL || len<= || k<=)
return ;
int start = ,end = len-;
int index = Partition(a,start,end);
//取出最小的K个数
while(index != k-)
{
if(index < k-)
{
start = index +;
index = Partition(a,start,end);
}else{
end = index -;
index = Partition(a,start,end);
}
}
for(int i=;i<k;++i)
cout<<a[i]<<" ";
cout<<endl;
} int _tmain(int argc, _TCHAR* argv[])
{
vector<int> v;
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
inSet least;
GetNumber1(v,least,); GetNumber2(v,); int a[]={,,,,,,,};
GetNumber2(a,,); system("pause");
return ;
}
最小的k个数的更多相关文章
- 剑指Offer面试题:27.最小的k个数
一.题目:最小的k个数 题目:输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 这道题是典型的TopK问题,其最简单的思路莫过于 ...
- 算法练习:寻找最小的k个数
参考July的文章:http://blog.csdn.net/v_JULY_v/article/details/6370650 寻找最小的k个数题目描述:查找最小的k个元素题目:输入n个整数,输出其中 ...
- 剑指Offer:面试题30——最小的k个数(java实现)
问题描述: 输入n个整数,找出其中最小的k个数 思路1: 先排序,再取前k个 时间复杂度O(nlogn) 下面给出快排序的代码(基于下面Partition函数的方法) public void Quic ...
- 输入一个数组,求最小的K个数
被这道题困了好久,看了剑指Offer才知道OJ上的要求有点迷惑性. 题目: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 一 ...
- 1046: 最小的K个数
1046: 最小的K个数 时间限制: 1 Sec 内存限制: 128 MB提交: 233 解决: 200[提交][状态][讨论版] 题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1 ...
- 最小的K个数:用快排的思想去解相关问题
实现快速排序算法的关键在于先在数组中选择一个数字,接下来把数组中的数字分为两部分,比选择的数字小的数字移到数组的左边,比选择的数字大的数字移到数组的右边. 这个函数可以如下实现: int Partit ...
- 剑指offer面试题30:最小的k个数
一.题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 二.解题思路 1.思路1 首先对数组进行排序,然后取出前k个数 ...
- 窥探算法之美妙——寻找数组中最小的K个数&python中巧用最大堆
原文发表在我的博客主页,转载请注明出处 前言 不论是小算法或者大系统,堆一直是某种场景下程序员比较亲睐的数据结构,而在python中,由于数据结构的极其灵活性,list,tuple, dict在很多情 ...
- 求一个数组中最小的K个数
方法1:先对数组进行排序,然后遍历前K个数,此时时间复杂度为O(nlgn); 方法2:维护一个容量为K的最大堆(<算法导论>第6章),然后从第K+1个元素开始遍历,和堆中的最大元素比较,如 ...
随机推荐
- Eclipse颜色主题插件:Eclipse Color Theme
一个很赞的eclipse插件,可以简单方便地实现eclipse下的代码配色.另外插件作者还专门为此插件做了一个eclipse配色网站,配色多达728个,开发者们也可以在此网站分享自己的配色方案. 插件 ...
- css中position与z-index
position属性 在css中,position属性用来控制元素的位置信息,其取值共有4种,即static.relative.absolute.fixed. 静态定位(static) 若没有指定po ...
- c# tcp备忘及networkstream.length此流不支持查找解决
服务端 bool isRunning = true; MouseKeyBoard mk = new MouseKeyBoard(); void InitTcpServer(int port) { T ...
- .net多线程的发展
APM和EAP是在async/await之前的两种不同的异步编程模式. APM如果不阻塞主线程,那么完成通知(回调)就会执行在另外一个线程中,从而给我们更新UI带来一定的问题. EAP的通知事件是在主 ...
- 在MVC中应用百度富文本编辑器
1.下载.NET版本的百度富文本编辑器,前往 下载.NET版本百度富文本框 2.解压下载的.zip压缩包,将utf8-.net文件夹名称改为:ueditor,复制到MVC根目录下面.结构如下: App ...
- .NET Framework 4.0之Tuple(元组)
Tuple,是函数式编程的概念之一,早见于Elang.F#等动态语言.Tuple类型像一个口袋,在出门前可以把所需的任何东西一股脑地放在里面.您可以将钥匙.驾驶证.便笺簿和钢笔放在口袋里,您的口袋是存 ...
- 【使用 DOM】使用 Document 对象
Document 对象时通往DOM功能的入口,它向你提供了当前文档的信息,以及一组可供探索.导航.搜索或操作结构与内容的功能. 我们通过全局变量document访问Document对象,它是浏览器为我 ...
- android XMl 解析神奇xstream 六: 把集合list 转化为 XML文档
前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...
- MyBatis入门(七)---逆向工程
一.逆向工程 1.1.概述 mybatis需要程序号自己编写的SQL. mybatis官方提供了逆向工程,可以针对单表自动生成mybatis执行所需要的代码 (mapper,java,maper.xm ...
- 最简MacOs10.8安装
虚拟机中安装Mac Os X的方法网上很多很多,但是对刚接触的朋友来讲肯定不是一件容易的事,这个自己深有体会,包括去年已经装好过,今年再找教程安装都装不起来,期间还出现了各种问题,幸好去年装好之后备份 ...