题目描述:输入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

此题的不同之处是最后的输出结果需要是排序过的,一般是不要求这个的。

最常见的解法就是使用快速排序和大顶堆。

方法一使用快速排序的思想,划分的操作不用改,对递归部分稍作修改

 #include<stdio.h>
#include<algorithm>
using namespace std;
int partition(int arr[], int s, int e){//返回分裂位置
int x = arr[s];//中轴元素
int j = e+;
int i = s;
while(i < j){
while(i < e && arr[++i] <= x);
while(j > s && arr[--j] > x);
if(i >= j) break;
swap(arr[j], arr[i]);
}
arr[s] = arr[j];
arr[j] = x;
return j;
}
int k;
void minK(int arr[],int start,int end){
if(start >= end) return;
int index = partition(arr,start,end);
if(index == k) return;
//类似二分的思想,比快速排序要少一个递归
if(index > k) minK(arr,start,index-);
else minK(arr,index+,end);
}
const int M = ;
int n,arr[M];
int main()
{
while(scanf("%d%d",&n, &k) != EOF){
for(int i=; i<n; i++){
scanf("%d", &arr[i]);
}
--k;
minK(arr,,n-);
sort(arr,arr+k+);//输出结果需要是排序的
for(int i=; i<k; i++)
printf("%d ",arr[i]);
printf("%d\n",arr[k]);
}
return ;
}

方法二使用 大顶堆。

 #include <algorithm>
#include <cstdio>
using namespace std;
int n,k,a[];
void adjustHeap(int idx){
int l = idx* + ;
int r = idx* + ;
int largeIndex = idx;
//先检查边界。k即为要创建的堆的大小
while( l<k || r<k ){
if(l<k && a[l] > a[largeIndex]) largeIndex = l;
if(r<k && a[r] > a[largeIndex]) largeIndex = r;
if(largeIndex != idx){
//交换 root和子节点。
swap(a[idx], a[largeIndex]);
//交换之后继续调整子节点
idx = largeIndex;
l = idx* + ;
r = idx* + ;
}else{
break; //无需调整
}
}
}
void buildHeap(){
for(int i= (k-)/; i>=; i--){
adjustHeap(i);
}
}
int main(){
while(scanf("%d%d", &n, &k) != EOF){
for(int i = ; i < k; i++)
scanf("%d", &a[i]);
buildHeap();
for(int i = k; i < n; i++){
scanf("%d", &a[i]);
if(a[] > a[i]){
swap(a[],a[i]);
adjustHeap();
}
}
sort(a,a+k);
for(int i = ; i<k-; i++)
printf("%d ", a[i]);
printf("%d\n", a[k-]);
}
}

效率差不多

九度 1371 最小的K个数的更多相关文章

  1. 剑指Offer - 九度1371 - 最小的K个数

    剑指Offer - 九度1371 - 最小的K个数2013-11-23 15:45 题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是 ...

  2. 剑指Offer(二十九):最小的K个数

    剑指Offer(二十九):最小的K个数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baid ...

  3. 九度OJ 1371 最小的K个数 -- 堆排序

    题目地址:http://ac.jobdu.com/problem.php?pid=1371 题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4 ...

  4. 【剑指Offer面试编程题】题目1371:最小的K个数--九度OJ

    题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 输入: 每个测试案例包括2行: 第一行为2个整数n,k(1< ...

  5. 九度OJ 题目1371:最小的K个数

    题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 输入: 每个测试案例包括2行: 第一行为2个整数n,k(1< ...

  6. 【剑指Offer面试题】 九度OJ1371:最小的K个数

    题目链接地址: http://ac.jobdu.com/problem.php?pid=1371 题目1371:最小的K个数 时间限制:1 秒内存限制:32 兆特殊判题:否提交:5938解决:1265 ...

  7. 剑指OFFER之最小的K个数(九度OJ1371)

    题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 输入: 每个测试案例包括2行: 第一行为2个整数n,k(1< ...

  8. 剑指offer二十九之最小的K个数

    一.题目 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 二.思路 详解代码. 三.代码 import java.util. ...

  9. 输入一个数组,求最小的K个数

    被这道题困了好久,看了剑指Offer才知道OJ上的要求有点迷惑性. 题目: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 一 ...

随机推荐

  1. LightOJ 1341 Aladdin and the Flying Carpet 数学

    题意:给个矩形的面积a,和矩形的最小边长b,问有多少种矩形的方案(不能是正方形) 分析:a可以写成x,y,因为不能是正方形,所以设x<y,那么x<sqrt(a),y>sqrt(a) ...

  2. SQL经典题-实战

    Student(S#,Sname,Sage,Ssex) 学生表       S#:学号:Sname:学生姓名:Sage:学生年龄:Ssex:学生性别 Course(C#,Cname,T#) 课程表   ...

  3. FFT矩阵

    举个例子: \[{F_4}=\left[{\begin{array}{*{20}{c}}1&1&1&1\\1&i&{-1}&{-i}\\1&{- ...

  4. TextField笔记

    今天写scrollPanel组件,碰到一个问题:textfield自动什么时候会调节高度. 在创建TextField的时候,我制定了文本的height属性. 之后,无论怎么设置文本,height总是不 ...

  5. 编译 skia

    0.准备工作 在 https://android.googlesource.com/ 用 git 代码,当然也可以从skia的官方https://code.google.com/p/skia/ 中获取 ...

  6. [HZWER]藏妹子之处

    问题描述 今天CZY又找到了三个妹子,有着收藏爱好的他想要找三个地方将妹子们藏起来,将一片空地抽象成一个R行C列的表格,CZY要选出3个单元格.但要满足如下的两个条件: (1)任意两个单元格都不在同一 ...

  7. 【JS】Intermediate1:The DOM

    1.DOM(The Document Object Model) A way to manipulate the structure and style of an HTML page. It rep ...

  8. UVALive 5135 Mining Your Own Business 双连通分量 2011final

    题意:n条隧道由一些点连接而成,其中每条隧道链接两个连接点.任意两个连接点之间最多只有一条隧道.任务就是在这些连接点中,安装尽量少的太平井和逃生装置,使得不管哪个连接点倒塌,工人都能从其他太平井逃脱, ...

  9. The Basics

    “Swift is a new programming language for iOS and OS X app development. Nonetheless, many parts of Sw ...

  10. 建立树莓派raspberry交叉编译环境以及编译内核

    最近买了一个树莓派,玩了几天,虽然已经有很多人玩了,现在玩好像有点晚了,但是他确实是个好东西,学好它,对嵌入式的整个开发流程也就会熟悉很多.虽然性能不是很强和现在的BB-BLACK比有点慢了,但是它便 ...