最小的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个元素开始遍历,和堆中的最大元素比较,如 ...
随机推荐
- sencha panel的头header上添加刷新按钮
var plet3=Ext.create('portaltest3.view.Portlet', { title: '提醒', ...
- LINQ TO XML 个人的一些心得1
最近没事做,刚来到一个新公司.写了一些处理xml的项目 就是把一些xml的数据处理后存储到数据库中.原本还是准备用原来的xml来写的.在群里有个人说,用linq to xml 好了,比较快捷.就看了 ...
- SqlServer根据时段统计数据
create table ST_PPTN_R_Real ( TID int primary key identity(1,1), STCD varchar(100) not null, TM date ...
- 从几篇文字得到关于web app开发的性能问题的答案
1. http://blogs.adobe.com/creativecloud/are-mobile-web-apps-slow/ 2. http://software.intel.com/zh-cn ...
- 配置了<mvc:resources> 导致以前的controller 无法访问。
解决方案: <mvc:annotation-driven/>
- 媒体对象 - Media Objects(摘录)
原文链接:http://www.jianshu.com/p/6443be21efbd 一个媒体对象由以下及部分组成 父容器 .media 媒体部分 .media-left 或者 .media-righ ...
- Incorrect string value: '\xF0\x90\x8D\x83...' for column 通用解决方案
mysql插入非ascii字符时报这个错的根本原因在于: 对应表的字符集无法存储要插入的字符,比如汉字插入latin1编码,某些特殊字符插入gbk或者utf8等. 检查一下实际插入的字符以及对应表或者 ...
- 用SQL语句操作数据
转载请注明出处:http://www.cnblogs.com/smbk/ 1.点击[新建查询]按钮,打开SQL命令编辑框,对数据库表的操作以及维护都可以通过编辑SQL命令实现. 2.在编辑框内编辑创建 ...
- Xml序列化、反序列化帮助类
之前从网络上找了一个Xml处理帮助类,并整理了一下,这个帮助类针对Object类型进行序列化和反序列化,而不需要提前定义Xml的结构,把它放在这儿供以后使用 /// <summary> / ...
- REUSE_ALV_POPUP_TO_SELECT的使用技巧
通过函数的方法弹出一个对话框,提供选择数据的功能…… DATA: BEGIN OF lt_exidv OCCURS , box TYPE char1, exidv TYPE exidv, status ...