【剑指offer-解题系列(30)】最小的K个数
来源:互联网 发布:房地产数据网 编辑:程序博客网 时间:2024/05/19 01:12
题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
分析
要找出前k个最大数,简单的方法就是快排,然后把前k个输出。
另外就是堆排序,最小堆直接把前k个最小的值输出。
(另外有一种所谓大数据的k个最小数的情况,这种方法就是先找出k个最小数,然后形成最大堆,每次来一个新数先和最大堆顶元素比较,就可以动态维护最小的k个数)
代码实现
void qsort(vector<int>&a ,int start,int end){
if(start>=end)
return;
int value = a[end];
int ind = start ;
for(int i = start ;i< end;i++){
if(a[i]<value){
swap(a[ind++],a[i]);
}
}
swap(a[ind],a[end]);
qsort(a , start,ind-1);
qsort(a , ind+1,end);
}
void HeapAdjust(vector<int>&a ,int start,int end){
for(int i = end ;i>=start;i--){////一定是从后往前
int left = 2*i+1;
int right = 2*i+2;
if( left <= end){
if(right>end){
if(a[i]>a[left])
swap(a[i],a[left]);
}
else if(a[i]>=a[left] && a[right]>=a[left]){
swap(a[i],a[left]);
}
else if(a[i]>=a[right] && a[left]>=a[right]){
swap(a[i],a[right]);
}
}
}
}
void HeapSort(vector<int>&a ,int start,int end){
for(int i = end;i>=start;i--){
HeapAdjust( a , start, i);
swap(a[i],a[start]);
}
}
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int>res;
if(k>input.size()){
return res;
}
int ind = input.size()-1;
for(int i =0;i<k;i++){
HeapAdjust( input ,0,ind );
swap(input[0],input[ind]);
res.push_back(input[ind]);
ind--;
}
return res;
}
vector<int> GetLeastNumbers_Solution2(vector<int> input, int k) {
HeapSort( input ,0,input.size()-1);
vector<int>res;
if(k>input.size()){
return res;
}
for(int i =0;i<k;i++){
res.push_back(input[i]);
}
return res;
}
- 【剑指offer-解题系列(30)】最小的K个数
- 剑指Offer系列-面试题30:最小的K个数
- 剑指offer-30:最小的k个数
- 剑指offer-30 最小的K个数
- 剑指offer 30 - 最小的k个数
- 剑指Offer-30-最小的k个数
- [剑指offer:30]最小的k个数
- 剑指offer 30 最小的k个数
- 最小的k个数(剑指offer)
- 剑指offer系列源码-最小的K个数
- 剑指offer系列之二十八:最小的k个数
- 【剑指offer系列】 最小的k个数___30
- 剑指offer系列之28:最小的k个数
- 剑指offer:(30)时间效率 :最小的K个数
- 剑指offer:最小的k个数
- 【剑指offer】最小的k个数
- 剑指offer--最小的K个数
- 剑指Offer之 - 最小的k个数
- [Leetcode] 156. Binary Tree Upside Down 解题报告
- java SSO 之Cas 笔记
- Head First Python学习笔记
- 【Git】Linux下的Git简单管理
- USACO Section 1.2 Transformations
- 【剑指offer-解题系列(30)】最小的K个数
- LeetCode 198. House Robber
- python的KNN算法基本实现
- fuzhuo---Problem 1205 小鼠迷宫问题
- 工程大小优化之图片资源
- C#代码操作/编辑Word的基础知识
- kotlin中安卓listview实现
- nyoj 417 死神来了 鸽巢定理
- 服务器常用的状态码及其对应的含义