【算法面试】n个数,找出其中最小的k个数,写出代码,要求最坏情况下的时间复杂度不能高于O(nlogk)
2015-03-17 14:11
281 查看
题目:n个数,找出其中最小的k个数,写出代码,要求最坏情况下的时间复杂度不能高于O(nlogk)
分析:
1. 使用最大堆,先压入堆中k个数,以后每一个数与堆顶(当前最大元素)比较,如果更小则替换堆顶。时间复杂度O(klogk + (n-k)logk) = O(nlogk)。注意优先队列的使用方式。如果是最小堆,则
priority_queue<int, vector<int>, greater<int> >,默认是最大堆priority_queue<int, vector<int>, less<int> >,末尾> >有空格。
2. 另外一一种可能的思路是使用快排,某一步的分割结果刚好是第k个数则算法停止。但是最坏情况下复杂度可能是O(n^2)
分析:
1. 使用最大堆,先压入堆中k个数,以后每一个数与堆顶(当前最大元素)比较,如果更小则替换堆顶。时间复杂度O(klogk + (n-k)logk) = O(nlogk)。注意优先队列的使用方式。如果是最小堆,则
priority_queue<int, vector<int>, greater<int> >,默认是最大堆priority_queue<int, vector<int>, less<int> >,末尾> >有空格。
2. 另外一一种可能的思路是使用快排,某一步的分割结果刚好是第k个数则算法停止。但是最坏情况下复杂度可能是O(n^2)
#include <iostream> #include <queue> #include <vector> using namespace std; void MinK(int* A, int n, int k){ priority_queue<int> pq; for(int i = 0;i < k;i++) pq.push(A[i]); for(int i = k;i < n;i++) if(A[i]<pq.top()){ pq.pop(); pq.push(A[i]); } for(int i = 0; i < k;i++){ A[i] = pq.top(); pq.pop(); } } int main(){ int n,k; cin >> n >> k; int a[100]; for(int i = 0; i<n;i++) cin>> a[i]; MinK(a,n,k); for(int i = 0;i < k; i++) cout << a[i]<< " "; cout << endl; return 0; }
相关文章推荐
- n个数,找出其中最小的k个数,写出代码,要求最坏情况下的时间复杂度不能高于O(n logk)
- 有一堆扑克牌,其中某张牌的张数超过了扑克牌总数的一半,请找到这张牌。写出算法思路、代码实现和算法的时间复杂度,要求算法尽可能高效。假设给定一个扑克牌的数组poker和它的大小n,请返回所求的扑克牌。
- 长度为n的整数数组,找出其中任意(n-1)个乘积最大的那一组,只能用乘法,不可 以用除法。要求对算法的时间复杂度和空间复杂度作出分析,可以写思路也可以写程序。
- 一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。并分析时间复杂度与空间复杂度
- 任意给定一个大于等于10的整数A,请写一程序,以最小的时间复杂度找出比A小并且最接近A的一个整数B。要求:A的每位之和与B的每位之和相等 例:如果A=123 那么B=114
- 二叉排序树中,令f = (最大值+最小值) / 2,设计一个算法, 找出距离f值最近、大于f值的结点。复杂度不能为O(n2)。
- 一个数组中,存在两个只出现一次的数字,其余的数字均出现两次。要求在时间复杂度o(n),空间复杂度为o(1)的情况下找出这两个数字
- 算法面试题——两个有序数组,将一个数组放入另一个空间很大的数组,要求合并之后依然有序,时间复杂度要求最小,不使用额外的数组。
- 一串首尾相连的珠子(m 个),有N 种颜色(N<=10),设计一个算法,取出其中一段,要求包含所有N 中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
- 一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
- 算法的时间复杂度和空间负责度、最坏情况和平均情况
- 一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
- 一串首尾相连的珠子(m 个),有N 种颜色(N<=10),设计一个算法,取出其中一段,要求包含所有N 中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
- 提出支持栈的Push和Pop操作以及第三种操作FindMin的数据结构,其中FindMin返回该数据结构的最小元素 所有操作在最坏的情况下的运行时间都是O(1)
- 给一个数组,求a[i]<a[j]的情况下,j-i的最大值是多少,要求用O(n)时间复杂度
- <算法导论>第九章3 最坏情况线性时间的选择
- 字符串移动(字符串为*号和26个字母的任意组合,把*号都移动到最左侧,把字母移到最右侧并保持相对顺序不变),要求时间和空间复杂度最小
- 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。
- 数组a[N],存放了1至N-1个数,其中某个数重复一次。写一个函数,找出被重复的数字.时间复杂度必须为o(N)函数原型:
- 给定一个数组 a[n], 输出b[n], 其中 b[i] = a[0]*a[1]...*a[i-1]*a[i+1]*....a[n]; 其中不能用除法 复杂度要求O(n)