寻找最小的k个数(四种方法)
1 使用从大到小的优先队列保存最小的K个数,每次取出K个数之后的其余数和堆顶元素比较,如果比堆顶元素小,则将堆顶元素删除,将该元素插入
void topK(int arr[],int n,int k)
{
if(k>n)
return;
priority_queue<int> q;
for(int i=;i<n;++i)
{
if(q.size()<k)
q.push(arr[i]);
else
{
if(arr[i]<q.top())
{
q.pop();
q.push(arr[i]);
}
}
}
while(!q.empty())
{
cout<<q.top()<<' ';
q.pop();
}
cout<<endl;
}
2 使用set的排序功能,以从大到小的顺序排序所有前K个元素,取出其余的元素与第一个元素比较,如果小于第一个元素,则将第一个元素删除,将当前元素插入。
void topK1(int arr[],int n,int k)
{
set<int,greater<int> > st;
if(k>n)
return;
for(int i=;i<n;++i)
{
if(st.size()<k)
st.insert(arr[i]);
else
{
auto iter=st.begin();
if(*iter>arr[i])
{
st.erase(iter);
st.insert(arr[i]);
}
}
}
auto iter=st.begin();
while(iter!=st.end())
{
cout<<*iter++<<' ';
}
cout<<endl;
}
3 使用partition的方法,每次找出一个数的固定位置index,其中左边的元素都比该元素小,右边的元素都比该元素大。如果index==k-1,则结束循环,找出的index及之前的元素就是k个最小的元素,否则如果index
大于k-1,则需要找的元素在index的左边,否则需要找的元素在index的右边。循环查找直到index==k-1。
int partition(int arr[],int s,int e)
{
int priov=arr[e];
int i=s-;
int j=s;
for(;j<e;++j)
{
if(arr[j]<priov)
{
++i;
swap(arr[i],arr[j]);
}
}
++i;
swap(arr[i],arr[e]);
return i;
}
void topK2(int arr[],int n,int k)
{
int index=partition(arr,,n-);
while(index!=k-)
{
if(index<k-)
index=partition(arr,index+,n-);
else
index=partition(arr,,index-);
}
for(int i=;i<k;++i)
cout<<arr[i]<<' ';
cout<<endl;
}
4 利用选择排序的功能,n个元素中找出最小值与第一个元素交换,从n-1个元素中找出次小值与第二个元素交换,直到找到k个元素位置。
void topK3(int arr[],int n,int k)
{
for(int i=;i<k;++i)
{
int min=i;
int j=i+;
while(j<n)
{
if(arr[j]<arr[min])
min=j;
++j;
}
if(min!=i)
swap(arr[min],arr[i]);
}
for(int i=;i<k;++i)
cout<<arr[i]<<' ';
cout<<endl;
}
寻找最小的k个数(四种方法)的更多相关文章
- 03寻找最小的k个数
题目描述:查找最小的k个元素 题目:输入n个整数,输出其中最小的k个. 例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4. 1:最简单 ...
- 算法练习:寻找最小的k个数
参考July的文章:http://blog.csdn.net/v_JULY_v/article/details/6370650 寻找最小的k个数题目描述:查找最小的k个元素题目:输入n个整数,输出其中 ...
- Java实现寻找最小的k个数
1 问题描述 有n个整数,请找出其中最小的k个数,要求时间复杂度尽可能低. 2 解决方案 2.1 全部排序法 先对这n个整数进行快速排序,在依次输出前k个数. package com.liuzhen. ...
- 算法笔记_035:寻找最小的k个数(Java)
目录 1 问题描述 2 解决方案 2.1 全部排序法 2.2 部分排序法 2.3 用堆代替数组法 2.4线性选择算法 1 问题描述 有n个整数,请找出其中最小的k个数,要求时间复杂度尽可能低. 2 ...
- 编程之法:面试和算法心得(寻找最小的k个数)
内容全部来自编程之法:面试和算法心得一书,实现是自己写的使用的是java 题目描述 输入n个整数,输出其中最小的k个. 分析与解法 解法一 要求一个序列中最小的k个数,按照惯有的思维方式,则是先对这个 ...
- 寻找最小的k个数
1. 能想到的最直接的办法,就是对数组进行排序,最好的排序算法的时间复杂性为O(n*logn),这一个方法请参照各种排序算法. 2. 另外申请一个k空间数组,依次更改里面的最大值,每做一次最多要扫描一 ...
- 算法练习-寻找最小的k个数
练习问题来源 https://wizardforcel.gitbooks.io/the-art-of-programming-by-july/content/02.01.html 要求 输入n个整数, ...
- 【1】TOPK最小的K个数(多种方法比较)
(头条) 最小的第K个数也是和这题topK一样的思路 1.全排序 时间复杂度O(nlogn) 2.Partiton思想 时间复杂度O(n) (因为不需要像快排一样对所有的分段都两两Partitio ...
- 每日一题 - 剑指 Offer 40. 最小的k个数
题目信息 时间: 2019-06-30 题目链接:Leetcode tag: 快排 难易程度:中等 题目描述: 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3. ...
随机推荐
- WinFrom柱形图
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- Django2.0之后使用外键时遇到 __init__() missing 1 required positional argument: 'on_delete'
1.Django2.0之后使用外键时遇到 __init__() missing 1 required positional argument: 'on_delete' 需要在外键创建时给on_dele ...
- 浏览器根对象window之值为字符串的属性
1. string属性 1.1 origin window.origin使用返回的是当前网页的网址.打开百度首页,并在控制台中输入 window.origin 控制台中会输出"https:/ ...
- Microsoft Visual Studio 2010下log4cplus的安装,集成,测试
原文:http://blog.csdn.net/eclipser1987/article/details/6904301 log4cplus是C++编写的开源的日志系统,功能非常全面,用到自己开发的工 ...
- SparseArray代替HashMap
相信大家都明白,手机软件的开发不同于PC软件的开发,因为手机性能相对有限,内存也有限,所谓“寸土寸金”,可能稍有不慎,就会导致性能的明显降低.Android为了方便开发者,特意在android.uti ...
- centos下运行python3.6+Django+mysql项目
文件准备: Django项目 myslq安装 关闭防火墙 用xshell拖拽到centos上 安装文件: 安装python3.6(3.7有问题) sh install_py36.sh 关闭防火墙 sh ...
- 使用wm_concat函数导致字符串过长
场景:使用select wm_concat(xxxxx) from table 的时候 返回的字符串过长 解决方案 :使用to_clob 将字符串转成 clob类型,但是由于使用的前端框架不能解析cl ...
- 几种常见的Windows 服务器无法联网/无法连接远程桌面等故障解决方案
SEO优化扫我一.服务器无法连接远程桌面 1.Ping不通IP,网站打不开,不可以远程连接.可能是服务器死机了,或者网络有问题,请尝试Web重启服务器或联系服务商确认. 2.Ping正常,网站可以打开 ...
- .net framework profiles /.net framework 配置
几年前一篇关于 .net framework client profile http://www.cnblogs.com/zzj8704/archive/2010/05/19/1739130.html ...
- Linux命令--文件处理
touch命令 Linux touch命令用于修改文件或者目录的时间属性,包括存取时间和更改时间.若文件不存在,系统会建立一个新的文件. ls -l 可以显示档案的时间记录. 语法 touch [-a ...