题目描述:输入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个数,并按从小到大顺序打印。
样例输入:
  1. 8 4
  2. 4 5 1 6 2 7 3 8
样例输出:
  1. 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+;
  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-);
  25. else minK(arr,index+,end);
  26. }
  27. const int M = ;
  28. int n,arr[M];
  29. int main()
  30. {
  31. while(scanf("%d%d",&n, &k) != EOF){
  32. for(int i=; i<n; i++){
  33. scanf("%d", &arr[i]);
  34. }
  35. --k;
  36. minK(arr,,n-);
  37. sort(arr,arr+k+);//输出结果需要是排序的
  38. for(int i=; i<k; i++)
  39. printf("%d ",arr[i]);
  40. printf("%d\n",arr[k]);
  41. }
  42. return ;
  43. }

方法二使用 大顶堆。

  1. #include <algorithm>
  2. #include <cstdio>
  3. using namespace std;
  4. int n,k,a[];
  5. void adjustHeap(int idx){
  6. int l = idx* + ;
  7. int r = idx* + ;
  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* + ;
  19. r = idx* + ;
  20. }else{
  21. break; //无需调整
  22. }
  23. }
  24. }
  25. void buildHeap(){
  26. for(int i= (k-)/; i>=; i--){
  27. adjustHeap(i);
  28. }
  29. }
  30. int main(){
  31. while(scanf("%d%d", &n, &k) != EOF){
  32. for(int i = ; 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[] > a[i]){
  38. swap(a[],a[i]);
  39. adjustHeap();
  40. }
  41. }
  42. sort(a,a+k);
  43. for(int i = ; i<k-; i++)
  44. printf("%d ", a[i]);
  45. printf("%d\n", a[k-]);
  46. }
  47. }

效率差不多

九度 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. bzoj1801

    题目就是每行每列最多放两个炮的意思: 首先不难想到状态压缩dp,但是当n,m<=100的时候显然会跪掉: 考虑每行最多就2个点,状压dp浪费了大量的空间 由于每行最多两个点,我们可以直接用f[i ...

  2. 【转】国内用户如何加快App Store的访问速度

    原文网址:http://www.app111.com/doc/100024206_1.html 作为国内互联网用户是比较可怜的,除了国外四大顶尖互联网服务不能访问外,就是App Store用得也比较痛 ...

  3. 【转】G++ 处理 /usr/bin/ld: cannot find -lc

    原文网址:http://blog.sina.com.cn/s/blog_67bbb71101010tto.html 用g++编译C++程序时显示出:/usr/lib/ld: cannot find - ...

  4. Android 中HttpClient和HttpURLConnection选取

    原文地址:http://android-developers.blogspot.com/2011/09/androids-http-clients.html 译文:http://yunfeng.sin ...

  5. [Raobin] Ext.net 页面由于CMB的store和对图像同时执行,所以不会触发非空验证 所以会在后台直接调Js去验证

    X.Call("valid", vm.ID_EDIT_FORM); x.Call("前台的js的方法名称"," 参数为集合");

  6. EMC

    1.EMC的概念 EMC(Electro Magnetic Compatibility)即电磁兼容,是指设备或系统在其电磁环境中符合要求运行并不对其环境中的任何设备产生无法忍受的电磁干扰的能力.就是它 ...

  7. 曲面Shader

    这是一个能让平面呈现出曲面效果的Shaer. 代码: Shader "Custom/CurvedWorld"{ Properties { // Diffuse texture _M ...

  8. 【CSS】Beginner5:Margins&Padding

    1.Properties for spacing-out elements 外边距:A margin is the space space outside something 内边距:padding ...

  9. 2015美团网 哈工大 第k个排列

    leetcode 上的Permutation Sequence 下面是可执行代码 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 以1 开头 123,132,共2!个数 2 开 ...

  10. uvalive 7331 Hovering Hornet 半平面交+概率期望

    题意:一个骰子在一个人正方形内,蜜蜂在任意一个位置可以出现,问看到点数的期望. 思路:半平面交+概率期望 #include<cstdio> #include<cstring> ...