题目:输入n个整数,找出其中最小的k个数,例如输入4,5,1,6,2,7,3,8 这8个数字,则最小的四个数字为1,2,3,4,

这道题是典型的TopK问题,剑指Offer提供了两种方法来实现,一种方法是parition方法,一种

方法是建立一个大小为k的堆进行topk求解

这里我们只解释第一种方法:

1.首先随机查找数组中一个元素作为一个基准,然后parition一次使得数组左边的元素小于基本,数组右边的元素大于基准。

2.此时将再将基准插入到数组适当的位置并返回该位置的索引。

3.如果索引index小于k-1则继续在[index+1,end]范围内进行parition,

4.如果索引index大于k-1则继续在[start,index-1]范围内进行pariton

5.直到index==k-1时候结束

代码实现如下:

 1 #include <iostream>
 2 using namespace std;
 3
 4 int Partiton(int array[],int start,int end)
 5 {
 6     int i=start;
 7     int j=end;
 8     int k=0;
 9     int base=array[0];
10     while(i<j)
11     {
12         if(i<j&&base<=array[j])
13             j--;
14
15         if(i<j)
16         {
17             array[i]=array[j];
18             i++;
19         }
20
21         if(i<j&&base>array[i])
22             i++;
23
24         if(i<j)
25         {
26             array[j]=array[i];
27             j--;
28         }
29     }
30
31     array[i]=base;
32
33     return i;
34 }
35
36 int FindTopK(int array[],int start,int end,int k)
37 {
38     int startindex=start;
39     int endindex=end;
40     int index=Partiton(array,startindex,endindex);
41
42
43
44     while(index!=k-1)
45     {
46         if(index>k-1)
47         {
48             endindex=index-1;
49             index=Partiton(array,startindex,endindex);
50         }
51         else
52         {
53             startindex=index+1;
54             index=Partiton(array,startindex,endindex);
55         }
56     }
57     return index;
58 }
59
60
61 int main()
62 {
63     int array[]={4,5,1,6,2,7,3,8};
64     int len=8;
65     int Index;
66     int k=4;
67     Index=FindTopK(array,0,len-1,k);
68
69     cout<<"The Top K number is: ";
70     for(int i=0;i<Index+1;i++)
71     {
72         cout<<array[i]<<" ";
73     }
74     cout<<endl;
75     system("pause");
76     return 0;
77 }

运行截图:

转载于:https://www.cnblogs.com/vpoet/p/4771160.html

面试题30.最小的k个数相关推荐

  1. 剑指offer面试题[30]-最小的k个数

    题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 分析思路:         这道题最简单的思路莫过于把输入的n个数排 ...

  2. 面试题40. 最小的k个数

    面试题40. 最小的k个数 思路:这题应为数据量很小,所以直接sort即可.如果数据去到10**9这种数据量的话,需要用到优先队列,遍历一次数组即可O(n+logn) 笔记:优先队列priority( ...

  3. 剑指offer: 面试题40. 最小的k个数

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

  4. 【剑指offer-Java版】30最小的K个数

    最小的K个数: 思路一:类似于第29题,直接进行Partion,直到返回值未K – 缺点是需要修改输入的数据 思路二:维护一个大顶堆,然后遍历一次给定数组 如果当前堆元素小于K个 那么直接将当前元素加 ...

  5. 剑指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 ...

  6. LeetCode:面试题40. 最小的k个数

    40. 最小的k个数 题目: 解题思路: 源码: 题目: 解题思路: 1.快速排序: 2.堆排序: 详细解释看leetcode的官网 源码: int comp(void *a,void *b){int ...

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

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

  8. [剑指 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], ...

  9. 剑指Offer——面试题30:最小的K个数

    题目:输入N个数字,找出其中最小的K个数. 思路:维护一个数组KMin,长度为K,存放最小的K个数.遍历原始数组的过程中,如果KMin不满,就直接在后边插入新的数字:如果KMin满了,就要找到其中最大 ...

最新文章

  1. python 统计分析apache日志_python切分apache日志文件
  2. 公司的实战Replica Sets+Sharding方案
  3. python打开文件_喜大普奔 | 如何在Win10下利用Python打开grib文件
  4. zen-coding for notepad++,前端最佳手写代码编辑器
  5. STM32之通用定时器输入捕获模式
  6. javascript 总结(常用工具类的封装)(转)
  7. Kubernetes中StatefulSet介绍
  8. 连发12款软硬件产品 瑞星领跑企业级安全市场
  9. 使用阿里巴巴矢量图标库下载所需的小图标
  10. 项目的组织结构(职能型、项目型和矩阵型)
  11. 【金融项目】尚融宝项目(二)
  12. 视频教程-JavaSE基础视频精讲⑰:IO流高级用法-Java
  13. rancher及灵雀云TKF中解决中文编码问题
  14. Android面试总结(持续更新修改)
  15. php 公众号 模板消息id如何获取_微信公众号后台模板消息如何实现发送的功能...
  16. 镍离子去除专业吸附技术,深度除镍工程段工艺设计
  17. check mk 监控 oracle
  18. python-format
  19. bxl类型封装怎么转换为AD库封装
  20. python timedelta() 和relativedelta()的区别

热门文章

  1. 最佳HTML5应用开发工具有哪些?
  2. 为什么C++编程让人觉得那么难学?
  3. 剖析Elasticsearch集群系列之二:分布式的三个C、translog和Lucene段
  4. 如何知道PostgreSQL数据库下每个数据库所对应的目录
  5. 操作基本数据类型的流/数据流
  6. spring3,上传文件ApplicationHttpRequest cannot be ca...
  7. eclipse maven plugin 插件安装和配置
  8. MOQL—筛选器(Selector)(二)
  9. 【重点!记忆化递归+DP】LeetCode 72. Edit Distance
  10. 狸猫换太子--删除无头单链表中结点