九度 1371 最小的K个数
题目描述:输入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个数相关推荐
- 在哪里能收到python实例代码-Python找出最小的K个数实例代码
题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 这个题目完成的思路有很多,很多排序算法都可以完成既定操作,关键是复 ...
- 面试题整理10 最小的k个数
<剑指offer>面试题30: 题目:输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 分析:求数组的第k小,如果能 ...
- 剑指offer面试题40. 最小的k个数(sort函数)
题目描述 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 思路 详见链接 代码 class Solution: ...
- [剑指 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], ...
- 程序员编程艺术:第三章、寻找最小的k个数
程序员编程艺术:第三章.寻找最小的k个数 作者:July. 时间:二零一一年四月二十八日. 致谢:litaoye, strugglever,yansha,luuillu,Sorehead,及狂想曲创作 ...
- 最小的k个数(第k小的数)
1. 利用快排的思想,由于每次只选择左右部分中的一部分,因此时间复杂度为O(n). # -*- coding:utf-8 -*- class Solution:# (O(n)复杂度)def GetLe ...
- 46最小的k个数 47寻找第k大
46 最小的k个数 第一反应排序的话是O(nlogn),暴力是O(NK),看了题解用优先队列,因为优先队列插入元素需要logn,我们只要让堆的大小控制在k,插入一个元素就值需要logk,这样整体的时间 ...
- 伍六七带你学算法 入门篇-最小的k个数
java面试题-最小的k个数 难度-简单 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 1: 输入:a ...
- 剑指offer 40.最小的 K 个数 python代码
题目 寻找数组中的最小的k个数,也叫topk问题. 牛客网测试地址 注意: 牛客网的提交需要将最终的结果排序 思路 快速排序的 partition() 方法,会返回一个整数 j 使得 a[l-j-1] ...
最新文章
- java 三个参数的运算符,java – 三个参数运算符:局部变量可能尚未初始化
- php curl 关闭tcp连接,BASH CURL:顺序运行时,请勿关闭请求之间的连接
- 百度历年笔试面试150题
- [VMM 2008虚拟化之初体验-1] 准备环境
- android 代码功能测试,Android触屏测试实例代码
- PHP中去除换行解决办法小结(PHP_EOL)
- 计算机投影仪的作用是什么,解开无屏电脑投影仪的神秘面纱,看看可以用它来做什么...
- 2020年第十七届中国研究生数学建模竞赛赛题+解压码
- URL中的#是什么意思
- 存款利息python题_python入门教程NO.8 用python写个存款利息计算器
- 解决:Connections could not be acquired from the unde
- 计算机网络七年级教学设计,初中七年级信息技术《计算机网络和因特网》教学设计.docx...
- Windows漏洞修复服务器,Windows Server 2008相关系统漏洞修复
- Linux攻关之基础模块九 系统基本权限
- 易语言 修改IE协议头模拟手机浏览网页
- X版Dr.COM校园网使用路由器上网
- Ceph运维告诉你分布式存储的那些“坑”
- BIM模型文件下载——轻轨站模型
- Android每日一文
- 北上广深之外,互联网经济也在杭州成都西安武汉异军突起