面试题15 - 查找最小的 k 个元素 [数组] / (堆优化 STL O(nlogk) )[STL]
2013-01-29 19:34
489 查看
平均复杂度 O(nlogk) 的基于快排的方法
#include <iostream> #include <cstdio> #include <cstring> #include <stack> #include <algorithm> #define BUG cout << "here\n"; using namespace std; const int N = 105; int a = {4, 5, 1, 6, 2, 7, 3, 8}; int partition(int a[], int left, int right) { if(left < right) { int l = left, r = right, x = a[l]; while(1) { while(l < r && a[r] >= x) r--; while(l < r && a[l] <= x) l++; if(l >= r) break; swap(a[r], a[l]); } swap(a[left], a[l]); return l; } else return left; } void solve(int* input, int n, int k) { if(input == NULL || k > n || 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++) { cout << input[i] << ' '; } cout << endl; } int main() { solve(a, 8, 5); return 0; }(堆优化 STL O(nlogk) ) 【STL】
#include <iostream> #include <string> #include <cstdio> #include <set> #include <vector> #include <functional> #include <algorithm> using namespace std; typedef multiset<int, greater<int> > intSet; /// 定义容器的 typedef multiset<int, greater<int> >::iterator setIterator; /// 定义迭代器的 void getLastNumbers(const vector<int>& data, intSet& setK, int k) { setK.clear(); if(k < 1 || data.size() < k) return; vector<int>::const_iterator iter = data.begin(); for(;iter != data.end(); ++iter) { if(setK.size() < k) { setK.insert(*iter); } else { setIterator iter2 = setK.begin(); // 最大的位置 if(*iter < (*iter2)) { setK.erase(iter2); setK.insert(*iter); } } } setIterator sit = setK.begin(); for(;sit != setK.end(); sit++) { cout << *sit << ' '; } cout << endl; } int main() { vector<int> V; V.push_back(4); V.push_back(5); V.push_back(1); V.push_back(6); V.push_back(2); V.push_back(7); V.push_back(3); V.push_back(8); intSet ms; getLastNumbers(V, ms, 5); return 0; }
相关文章推荐
- 面试题15 - 查找最小的 k 个元素 [数组] / (堆优化 STL O(nlogk) )[STL]
- 5. 微软面试题: 查找最小的k个元素(数组)
- 实验九指针1、程序填空:下列程序在数组中同时查找最大元素和最小元素的下标,分别存放在 main()函数的max 和 min 变量中。要求:根据运行结果分析程序和填空,并注释说明填充依据。
- 程序员面试题精选100题(05)-查找最小的k个元素
- 程序员面试题目总结--数组(三)【旋转数组的最小数字、旋转数组中查找指定数、两个排序数组所有元素中间值、数组中重复次数最多的数、数组中出现次数超过一半的数】
- C++ 算法 查找旋转数组中的最小值 允许重复元素
- 剑指Offer面试题8:寻找旋转数组的最小元素
- 微策略面试题:在旋转后的数组中查找元素(二分查找)
- 实验9 指针1 、程序填空:下列程序在数组中同时查找最大元素和最小元素的下标,分别存放在 main()函数的max 和 min 变量中。要求:根据运行结果分析程序和填空,并注释说明填充依
- 查找最小的k个元素(数组)
- 程序员面试题精选100题(05)-查找最小的k个元素[算法]
- 程序员面试题精选100题(05)-查找最小的k个元素
- 微策略面试题:在旋转后的数组中查找元素(二分查找)
- 【剑指offer】2.4.1查找和排序——面试题8:旋转数组的最小数字
- 设计一个最优算法来查找n个元素数组中的最大值和最小值
- [经典面试题]排序数组中绝对值最小元素
- 优化从升序数组中查找输入元素的下标的方法
- 电话面试题--查找数组中第K大的元素
- 程序员面试题精选100题(42)-旋转数组的最小元素
- 微软面试题系列(五):查找最小的 k 个元素