面试题30.最小的k个数
2015-08-30 17:05
639 查看
题目:输入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时候结束
代码实现如下:
运行截图:
这道题是典型的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时候结束
代码实现如下:
#include <iostream> using namespace std; int Partiton(int array[],int start,int end) { int i=start; int j=end; int k=0; int base=array[0]; while(i<j) { if(i<j&&base<=array[j]) j--; if(i<j) { array[i]=array[j]; i++; } if(i<j&&base>array[i]) i++; if(i<j) { array[j]=array[i]; j--; } } array[i]=base; return i; } int FindTopK(int array[],int start,int end,int k) { int startindex=start; int endindex=end; int index=Partiton(array,startindex,endindex); while(index!=k-1) { if(index>k-1) { endindex=index-1; index=Partiton(array,startindex,endindex); } else { startindex=index+1; index=Partiton(array,startindex,endindex); } } return index; } int main() { int array[]={4,5,1,6,2,7,3,8}; int len=8; int Index; int k=4; Index=FindTopK(array,0,len-1,k); cout<<"The Top K number is: "; for(int i=0;i<Index+1;i++) { cout<<array[i]<<" "; } cout<<endl; system("pause"); return 0; }
运行截图:
相关文章推荐
- 剑指offer面试题29-数组中出现次数超过一半的数字
- 黑马程序员——————集合框架《一》
- 网页优化个人总结
- 面向程序员的免费杂志
- 《剑指Offer》面试题:从尾到头打印链表
- 黑马程序员_集合框架(四)
- 面试题7:用两个栈实现队列
- 面试题6:重建二叉树
- 面试题5:从尾到头打印链表
- 面试题29.数组中出现次数超过一半的数字
- 面试题4:替换空格
- 黑马程序员-Java基础【1】(关键字,标识符,常量,变量,运算符)
- 面试题3:二维数组中的查找
- 8月的总结---适应职场,锤炼自我
- <Java笔试面试题>final,finally,finalize()区别
- 面试题28.字符串的排列
- 面试题2:实现一个Singleton模式
- 控制反转与依赖注入
- 阿里2016面试笔试题目之棋盘走法
- 剑指offer-第六章面试中的各项能力(和为S的两个数字VS和为S的连续正序列)