bfprt算法,中位数的中位数算法,O(n)时间复杂度求解第k大数
来源:互联网 发布:windows nc命令工具 编辑:程序博客网 时间:2024/05/17 21:53
215. Kth Largest Element in an Array
题目地址
https://leetcode.com/problems/kth-largest-element-in-an-array/
题目描述
Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.
For example,
Given [3,2,1,5,6,4] and k = 2, return 5.
Note:
You may assume k is always valid, 1 ≤ k ≤ array’s length.
bfprt 求解,ac代码如下
class Solution {public: /* 快排思路 一次划分 */ int quickpart(vector<int> &a, int l, int r,int pos) { int tmp = a[pos]; a[pos] = a[l]; a[l] = tmp; int pivot = a[l]; int i = l; int j = r; while(i < j) { while(a[j] >= pivot && i < j) j--; a[i] = a[j]; while(a[i] < pivot && i < j) i++; a[j] = a[i]; } a[i] = pivot; return i; } /* bfprt 算法*/ int bfprt(vector<int> &a, int l, int r, int k) { if(r - l + 1 <= 5) // 小于等于5个元素 直接排序输出结果 { sort(a.begin()+l, a.begin() + r + 1); return a[l + k - 1]; } // 1 首先把数组按5个数为一组进行分组,最后不足5个的忽略。对每组数进行排序(如插入排序)求取其中位数。 // 2 把上一步的所有中位数移到数组的前面 int t = l; int cnt = (r - l + 1) / 5; for(int i=0;i<cnt;i++) { sort(a.begin() + l + i*5, a.begin() + l + (i+1) *5); int tmp = a[l + i * 5 + 2]; a[l + i * 5 + 2] = a[t]; a[t] = tmp; t++; } t--; // 3 对这些中位数递归调用BFPRT算法求得他们的中位数 int pos = (l + t) / 2; // l-t的中位数的下标, 中位数是第 pos - l + 1数 bfprt(a,l,t,pos - l + 1); // 递归查找中位数的中位数,确保中位数在pos这个位置 // 4 将上一步得到的中位数作为划分的主元进行整个数组的划分, 快排思路 int m = quickpart(a,l,r, pos); // 5 判断第k个数在划分结果的左边、右边还是恰好是划分结果本身,前两者递归处理,后者直接返回答案。 if(m - l +1 == k) return a[m]; else if(m-l + 1 < k) return bfprt(a,m+1,r,k - (m-l+1)); else return bfprt(a,l, m -1, k);; } int findKthLargest(vector<int>& nums, int k) { int len = nums.size(); return bfprt(nums, 0, len-1, len-k+1); }};
0 0
- bfprt算法,中位数的中位数算法,O(n)时间复杂度求解第k大数
- BFPRT(中位数的中位数)算法
- 如何用O(n)时间复杂度查找第k大数的优化算法 C++程序
- 算法导论 9.3-7 O(n)时间求最接近中位数的k个数
- 强大的随机算法-简洁的O(n)时间复杂度解决查找第k大数问题优化算法
- BFPTR算法(中位数的中位数算法)求n个数中第k大的数
- 求中位数的O(n)算法
- O(n)线性时间找第K大,中位数
- 找中位数O(n)算法
- 求一个数组的中位数时间复杂度为O(n)
- 关于中位数的时间复杂度为什么是O(n)
- 算法: 快速求中位数(第k大数)
- BFPRT算法求第k大数
- O(n)时间求最接近中位数的k个数
- O(n)时间求最接近中位数的k个数
- 已知数组A[1...n] ,确定第K小元素 算法的时间复杂度O(n)
- 查找中位数的O(N)算法和Kmin算法
- 找第k大数,最坏时间复杂度O(n)
- 京东咚咚架构演进(IM通讯)
- IC卡借/贷记应用交易流程
- oracle事物提交后回滚到某一时间点
- spring4软件包介绍
- Qt OpenCV imread 中文路径
- bfprt算法,中位数的中位数算法,O(n)时间复杂度求解第k大数
- SQL表连接图解
- MYSQL数据库导入数据时出现乱码的解决办法
- Android安卓自定义圆角矩形控件,省去定义drawable里面xml的麻烦,轻松编程
- 彻底理解JAVA动态代理
- 几何画板演示点的运动路径图像的教程
- 怎么签约single_trade_query接口,人工服务
- Activity你应该知道的一切
- 马潮按键扫描状态机思想10ms执行一次