题目描述:输入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. EPUB弹出窗口式脚注

    网上搜到一些国学典籍的EPUB版,虽有古人的注解,但正文和注解混排在一起,当我只想迅速读正文的时候比较碍眼.于是研究了一下 EPUB3 中有关脚注(footnote)的规格定义,写了一个 Python ...

  2. Error:Could not open initscript class cache for initialization script 'C:\Users\Avishek\AppData\Local\Temp\asLocalRepo14.gradle' (C:\Users\Avishek.gradle\caches\2.2.1\scripts\asLocalRepo14_dkwbdtenxxg

    Error:Could not open initscript class cache for initialization script 见鬼 Android Studio打开项目时遇到这个问题 昨 ...

  3. JSP---演示ErroPage、isErroPage和jsp:forword标签

    属性说明: language – 示例:language="java" import -如: (注意多个引用之间使用逗号分开.) <%@ page import=" ...

  4. NDK编译路径问题

    有点偷懒,在一个使用了jni工程里面稍微修改一下,编译另外一个jni工程. 代码写完后,Android.mk等文件也写好,但是ndk-build的时候提示Android NDK:Your APP_BU ...

  5. vmware 8下ubuntu 13.04安装vmware tools

    在虚拟机vmware 8.0里安装了ubuntu 13.04.为了方便与主机交互,安装vmware tools. 解压后直接运行 ./vmware-install.pl 一路默认路径安装下来,到&qu ...

  6. Java读取文件夹大小的6种方法及代码

    (一)单线程递归方式 package com.taobao.test; import java.io.File; public class TotalFileSizeSequential { publ ...

  7. A Tour of Go Range

    The range form of the for loop iterates over a slice or map. package main import "fmt" , , ...

  8. ios:Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - perhaps the designated entry point is not set?

    - (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)laun ...

  9. Xcode5.1离线下载安装及使用iOS5模拟器进行开发调试的方法

    Xcode5.1默认不支持iOS5版本的模拟器开发调试,在OS X Mavericks(10.9.x)下默认只能支持iOS6.1及以上版本的模拟器,在OS X Mountain Lion(10.8.x ...

  10. oc学习之路----代理模式2-使用步骤

    之前已经写过一个个人关于代理模式的一些看法,现在就来总结一下使用代理模式的步骤吧. 1.先搞清楚谁是谁的代理(delegate) ● 2.定义代理协议,协议名称的命名规范:控件类名 + Delegat ...