微软100题(5) 查找最小的k个元素
2015-05-19 21:48
253 查看
题目:输入n个整数,输出其中最小的k个。
例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。
方法一:如果可以修改原来数组的元素,则利用快排的partition算法,可以把较小的k个元素,划分到前面去
思路二:不能修改原数组,则需要开辟一个能装k个元素的容器,每再来一个元素,和已有的元素中最大的替换,如果大于等于最大的,舍弃之
如何能尽快的取出K个元素中最大的元素,可以利用标准库的set实现,其底层是利用红黑树实现,利用一个比较大于的谓词,可以实现set集合中的元素有序。例如: multiset<int,greater<int> > Kset; 则Kset中的元素第一个始终是最大的。
例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。
方法一:如果可以修改原来数组的元素,则利用快排的partition算法,可以把较小的k个元素,划分到前面去
int Partition(vector<int> &data,int start, int end) { int i=start,j=end; while (i<j) { while (i < j && data[i] <= data[j]) j--; if(data[i]>data[j]) { swap(data[i],data[j]); i++; } while (i < j && data[i] <= data[j]) i++; if(data[i]>data[j]) { swap(data[i],data[j]); j--; } } return i; } void GetLeastKNum(vector<int> &input,int n,vector<int> &output,int K) { if(n<K || n<=0 || K<=0) return; int start = 0; int end = n-1; int index = Partition(input,start,end); while (index != K-1) { if(index > K-1) { end = index - 1; index = Partition(input,start,end); } else { start = index + 1; index = Partition(input,start,end); } } for (int i = 0; i < K; ++i) { output.push_back(input[i]); } }
思路二:不能修改原数组,则需要开辟一个能装k个元素的容器,每再来一个元素,和已有的元素中最大的替换,如果大于等于最大的,舍弃之
如何能尽快的取出K个元素中最大的元素,可以利用标准库的set实现,其底层是利用红黑树实现,利用一个比较大于的谓词,可以实现set集合中的元素有序。例如: multiset<int,greater<int> > Kset; 则Kset中的元素第一个始终是最大的。
typedef multiset<int,greater<int> > Kset; typedef multiset<int,greater<int> >::iterator setIterator; void GetLeastKNum(vector<int>& data,Kset& Knum,int K) { Knum.clear(); int n = data.size(); if(K<=0 || n < K) return; for (int i=0; i<n; ++i) { if(Knum.size()<K) Knum.insert(data[i]); else { setIterator iter = Knum.begin(); if(*iter > data[i]) { Knum.erase(iter); Knum.insert(data[i]); } } } }
相关文章推荐
- 查找最小的k个元素 【微软面试100题 第五题】
- 微软等数据结构+算法面试100题(46)-- 查找最小的k 个元素
- 【从零单排之微软面试100题系列】05之查找最小的k个元素
- (微软面试100题)查找最小的K个元素
- 微软面试100题目之5 查找最小的k个元素
- 查找最小的k个元素 【微软面试100题 第五题】
- 微软算法100题05 查找最小的k 个元素
- 微软面试题系列(五):查找最小的 k 个元素
- 程序员面试100题---5.查找最小的k个元素
- 【100题】查找最小的k个元素
- 微软面试100题系列---交换元素使2个序列的差值最小
- 微软100题(69)旋转数组中的最小元素(数组、算法)
- [程序员面试题精选100题]5.查找最小的k个元素
- 微软算法100道题-----查找最小的k个元素
- 交换元素,使两数组之和的差最小 【微软面试100题 第三十二题】
- 程序员面试题100题第05题——查找最小的K个元素
- 旋转数组中的最小元素 【微软面试100题 第六十九题】
- 旋转数组中的最小元素 【微软面试100题 第六十九题】
- 程序员面试题精选100题(05)-查找最小的k个元素
- 面试100题:5.查找最小的k个元素