面试题30.最小的k个数
题目:输入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个数相关推荐
- 剑指offer面试题[30]-最小的k个数
题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 分析思路: 这道题最简单的思路莫过于把输入的n个数排 ...
- 面试题40. 最小的k个数
面试题40. 最小的k个数 思路:这题应为数据量很小,所以直接sort即可.如果数据去到10**9这种数据量的话,需要用到优先队列,遍历一次数组即可O(n+logn) 笔记:优先队列priority( ...
- 剑指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] ...
- 【剑指offer-Java版】30最小的K个数
最小的K个数: 思路一:类似于第29题,直接进行Partion,直到返回值未K – 缺点是需要修改输入的数据 思路二:维护一个大顶堆,然后遍历一次给定数组 如果当前堆元素小于K个 那么直接将当前元素加 ...
- 剑指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 ...
- LeetCode:面试题40. 最小的k个数
40. 最小的k个数 题目: 解题思路: 源码: 题目: 解题思路: 1.快速排序: 2.堆排序: 详细解释看leetcode的官网 源码: int comp(void *a,void *b){int ...
- 剑指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], ...
- 剑指Offer——面试题30:最小的K个数
题目:输入N个数字,找出其中最小的K个数. 思路:维护一个数组KMin,长度为K,存放最小的K个数.遍历原始数组的过程中,如果KMin不满,就直接在后边插入新的数字:如果KMin满了,就要找到其中最大 ...
最新文章
- python 统计分析apache日志_python切分apache日志文件
- 公司的实战Replica Sets+Sharding方案
- python打开文件_喜大普奔 | 如何在Win10下利用Python打开grib文件
- zen-coding for notepad++,前端最佳手写代码编辑器
- STM32之通用定时器输入捕获模式
- javascript 总结(常用工具类的封装)(转)
- Kubernetes中StatefulSet介绍
- 连发12款软硬件产品 瑞星领跑企业级安全市场
- 使用阿里巴巴矢量图标库下载所需的小图标
- 项目的组织结构(职能型、项目型和矩阵型)
- 【金融项目】尚融宝项目(二)
- 视频教程-JavaSE基础视频精讲⑰:IO流高级用法-Java
- rancher及灵雀云TKF中解决中文编码问题
- Android面试总结(持续更新修改)
- php 公众号 模板消息id如何获取_微信公众号后台模板消息如何实现发送的功能...
- 镍离子去除专业吸附技术,深度除镍工程段工艺设计
- check mk 监控 oracle
- python-format
- bxl类型封装怎么转换为AD库封装
- python timedelta() 和relativedelta()的区别
热门文章
- 最佳HTML5应用开发工具有哪些?
- 为什么C++编程让人觉得那么难学?
- 剖析Elasticsearch集群系列之二:分布式的三个C、translog和Lucene段
- 如何知道PostgreSQL数据库下每个数据库所对应的目录
- 操作基本数据类型的流/数据流
- spring3,上传文件ApplicationHttpRequest cannot be ca...
- eclipse maven plugin 插件安装和配置
- MOQL—筛选器(Selector)(二)
- 【重点!记忆化递归+DP】LeetCode 72. Edit Distance
- 狸猫换太子--删除无头单链表中结点