题目描述:输入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 #include<stdio.h>
 2 #include<algorithm>
 3 using namespace std;
 4 int partition(int arr[], int s, int e){//返回分裂位置
 5     int x = arr[s];//中轴元素
 6     int j = e+1;
 7     int i = s;
 8     while(i < j){
 9         while(i < e && arr[++i] <= x);
10         while(j > s && arr[--j] > x);
11         if(i >= j) break;
12         swap(arr[j],  arr[i]);
13     }
14     arr[s] = arr[j];
15     arr[j] = x;
16     return j;
17 }
18 int k;
19 void minK(int arr[],int start,int end){
20     if(start >= end) return;
21     int index = partition(arr,start,end);
22     if(index == k) return;
23     //类似二分的思想,比快速排序要少一个递归
24     if(index > k) minK(arr,start,index-1);
25     else minK(arr,index+1,end);
26 }
27 const int M = 200001;
28 int n,arr[M];
29 int main()
30 {
31     while(scanf("%d%d",&n, &k) != EOF){
32         for(int i=0; i<n; i++){
33             scanf("%d", &arr[i]);
34         }
35          --k;
36          minK(arr,0,n-1);
37          sort(arr,arr+k+1);//输出结果需要是排序的
38          for(int i=0; i<k; i++)
39              printf("%d ",arr[i]);
40          printf("%d\n",arr[k]);
41     }
42     return 0;
43 }

View Code

方法二使用 大顶堆。

 1 #include <algorithm>
 2 #include <cstdio>
 3 using namespace std;
 4 int n,k,a[200000];
 5 void adjustHeap(int idx){
 6     int l = idx*2 + 1;
 7     int r = idx*2 + 2;
 8     int largeIndex = idx;
 9     //先检查边界。k即为要创建的堆的大小
10     while( l<k  || r<k ){
11         if(l<k && a[l] > a[largeIndex]) largeIndex = l;
12         if(r<k && a[r] > a[largeIndex]) largeIndex = r;
13         if(largeIndex != idx){
14             //交换 root和子节点。
15             swap(a[idx], a[largeIndex]);
16             //交换之后继续调整子节点
17             idx = largeIndex;
18             l = idx*2 + 1;
19             r = idx*2 + 2;
20         }else{
21             break; //无需调整
22         }
23     }
24 }
25 void buildHeap(){
26     for(int i= (k-1)/2; i>=0; i--){
27         adjustHeap(i);
28     }
29 }
30 int main(){
31     while(scanf("%d%d", &n, &k) != EOF){
32         for(int i = 0; i < k; i++)
33             scanf("%d", &a[i]);
34         buildHeap();
35         for(int i = k; i < n; i++){
36             scanf("%d", &a[i]);
37             if(a[0] > a[i]){
38                 swap(a[0],a[i]);
39                 adjustHeap(0);
40             }
41         }
42         sort(a,a+k);
43         for(int i = 0; i<k-1; i++)
44                 printf("%d ", a[i]);
45         printf("%d\n", a[k-1]);
46     }
47 }

View Code

效率差不多

转载于:https://www.cnblogs.com/qinduanyinghua/p/5693505.html

九度 1371 最小的K个数相关推荐

  1. 在哪里能收到python实例代码-Python找出最小的K个数实例代码

    题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 这个题目完成的思路有很多,很多排序算法都可以完成既定操作,关键是复 ...

  2. 面试题整理10 最小的k个数

    <剑指offer>面试题30: 题目:输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 分析:求数组的第k小,如果能 ...

  3. 剑指offer面试题40. 最小的k个数(sort函数)

    题目描述 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 思路 详见链接 代码 class Solution: ...

  4. [剑指 offer]--大顶堆 ➕ 快速选择 --面试题40. 最小的k个数

    1 题目描述 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 1: 输入:arr = [3,2,1], ...

  5. 程序员编程艺术:第三章、寻找最小的k个数

    程序员编程艺术:第三章.寻找最小的k个数 作者:July. 时间:二零一一年四月二十八日. 致谢:litaoye, strugglever,yansha,luuillu,Sorehead,及狂想曲创作 ...

  6. 最小的k个数(第k小的数)

    1. 利用快排的思想,由于每次只选择左右部分中的一部分,因此时间复杂度为O(n). # -*- coding:utf-8 -*- class Solution:# (O(n)复杂度)def GetLe ...

  7. 46最小的k个数 47寻找第k大

    46 最小的k个数 第一反应排序的话是O(nlogn),暴力是O(NK),看了题解用优先队列,因为优先队列插入元素需要logn,我们只要让堆的大小控制在k,插入一个元素就值需要logk,这样整体的时间 ...

  8. 伍六七带你学算法 入门篇-最小的k个数

    java面试题-最小的k个数 难度-简单 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 1: 输入:a ...

  9. 剑指offer 40.最小的 K 个数 python代码

    题目 寻找数组中的最小的k个数,也叫topk问题. 牛客网测试地址 注意: 牛客网的提交需要将最终的结果排序 思路 快速排序的 partition() 方法,会返回一个整数 j 使得 a[l-j-1] ...

最新文章

  1. java 三个参数的运算符,java – 三个参数运算符:局部变量可能尚未初始化
  2. php curl 关闭tcp连接,BASH CURL:顺序运行时,请勿关闭请求之间的连接
  3. 百度历年笔试面试150题
  4. [VMM 2008虚拟化之初体验-1] 准备环境
  5. android 代码功能测试,Android触屏测试实例代码
  6. PHP中去除换行解决办法小结(PHP_EOL)
  7. 计算机投影仪的作用是什么,解开无屏电脑投影仪的神秘面纱,看看可以用它来做什么...
  8. 2020年第十七届中国研究生数学建模竞赛赛题+解压码
  9. URL中的#是什么意思
  10. 存款利息python题_python入门教程NO.8 用python写个存款利息计算器
  11. 解决:Connections could not be acquired from the unde
  12. 计算机网络七年级教学设计,初中七年级信息技术《计算机网络和因特网》教学设计.docx...
  13. Windows漏洞修复服务器,Windows Server 2008相关系统漏洞修复
  14. Linux攻关之基础模块九 系统基本权限
  15. 易语言 修改IE协议头模拟手机浏览网页
  16. X版Dr.COM校园网使用路由器上网
  17. Ceph运维告诉你分布式存储的那些“坑”
  18. BIM模型文件下载——轻轨站模型
  19. Android每日一文
  20. 北上广深之外,互联网经济也在杭州成都西安武汉异军突起

热门文章

  1. 红帽集群套件RHCS
  2. 第49周星期二PD数据库逆向工程
  3. GridView分页(第一页、上一页、下一页、最后页、当前页数/总页数)
  4. 一款能拖拉的winform树形控件
  5. linux连sql server
  6. border属性的CSS缩写顺序
  7. “数据库审计”关键词,重回Google第一位置
  8. Tip #6 用ASP.NET AJAX判断当前浏览器类型
  9. 李开复给中国学生的第七封信:21世纪最需要的7种人才
  10. 中小企业数据异地备份容灾解决方案