log(m+n)找第k大
递归
int find_kth(vector<int>& nums1, int begin1, int size1, vector<int>& nums2, int begin2, int size2, int k)
{
size1 = min(k, size1);//第k大最多只要前k个
size2 = min(k, size2);
if (k == 1)
{
return min(nums1[begin1], nums2[begin2]);
}
if (size1 == 1)
{
if (begin2 + k - 1 < nums2.size())
return min(max(nums1[begin1], nums2[begin2 + k - 2]), nums2[begin2 + k - 1]);
else
return max(nums1[begin1], nums2[begin2 + k - 2]);
}
if (size2 == 1)
{
if (begin1 + k - 1 < nums1.size())
return min(max(nums2[begin2], nums1[begin1 + k - 2]), nums1[begin1 + k - 1]);
else
return max(nums2[begin1], nums1[begin1 + k - 2]);
}
double s = k / static_cast<double>(size1 + size2);//对应的比例位置
int q = s*(size1)+begin1;/**/
int p = s*(size2)+begin2;/**/
if (static_cast<int>(s*(size1)) + static_cast<int>(s*(size2))> k - 1 && (q - begin1) && (p - begin2))
//调节使 k刚好落在p 或 k,p k有可能是第k大在下一轮仍保留
{
--p;
--q;
}
if (static_cast<int>(s*(size1)) + static_cast<int>(s*(size2))< k - 3 && (q - begin1) && (p - begin2))
//调节使 k刚好落在p 或 k
{
++p;
++q;
}
if (nums1[q] > nums2[p])
{
k = k - (p - begin2);
size1 = q - begin1 + 1;
size2 -= (p - begin2);
begin2 = p;
}
else
{
if (nums1[q] < nums2[p])
{
k = k - (q - begin1);
size1 -= (q - begin1);
begin1 = q;
size2 = p - begin2 + 1;
}
else
{
return nums1[q];
}
}
return find_kth(nums1, begin1, size1, nums2, begin2, size2, k);
}
迭代
int find_kth(vector<int>& nums1, int begin1, int size1, vector<int>& nums2, int begin2, int size2, int k)
{
while (!(size2 == 1 || size1 == 1 || k == 1))
{
size1 = min(k, size1);//第k大最多只要前k个
size2 = min(k, size2);
double s = k / static_cast<double>(size1 + size2);//对应的比例位置
int q = s*(size1)+begin1;/**/
int p = s*(size2)+begin2;/**/
if (static_cast<int>(s*(size1)) + static_cast<int>(s*(size2)) > k - 1 && (q - begin1) && (p - begin2))
//调节使 k刚好落在p 或 k
{
--p;
--q;
}
if (static_cast<int>(s*(size1)) + static_cast<int>(s*(size2)) < k - 3 && (q - begin1) && (p - begin2))
//调节使 k刚好落在p 或 k p k可能为第k大下轮保留
{
++p;
++q;
}
if (nums1[q] > nums2[p])
{
k = k - (p - begin2);
size1 = q - begin1 + 1;
size2 -= (p - begin2);
begin2 = p;
}
else
{
if (nums1[q] < nums2[p])
{
k = k - (q - begin1);
size1 -= (q - begin1);
begin1 = q;
size2 = p - begin2 + 1;
}
else
{
return nums1[q];
}
}
}
if (k == 1)
{
return min(nums1[begin1], nums2[begin2]);
}
if (size1 == 1)
{
if (begin2 + k - 1 < nums2.size())
return min(max(nums1[begin1], nums2[begin2 + k - 2]), nums2[begin2 + k - 1]);
else
return max(nums1[begin1], nums2[begin2 + k - 2]);
}
if (size2 == 1)
{
if (begin1 + k - 1 < nums1.size())
return min(max(nums2[begin2], nums1[begin1 + k - 2]), nums1[begin1 + k - 1]);
else
return max(nums2[begin1], nums1[begin1 + k - 2]);
}
}
log(m+n)找第k大的更多相关文章
- 找第k大的数
(找第k大的数) 给定一个长度为1,000,000的无序正整数序列,以及另一个数n(1<=n<=1000000),接下来以类似快速排序的方法找到序列中第n大的数(关于第n大的数:例如序列{ ...
- 快速排序算法的实现 && 随机生成区间里的数 && O(n)找第k小 && O(nlogk)找前k大
思路:固定一个数,把这个数放到合法的位置,然后左边的数都是比它小,右边的数都是比它大 固定权值选的是第一个数,或者一个随机数 因为固定的是左端点,所以一开始需要在右端点开始,找一个小于权值的数,从左端 ...
- luogu_P1177 【模板】快速排序 (快排和找第k大的数)
[算法] 选取pivot,然后每趟快排用双指针扫描(l,r)区间,交换左指针大于pivot的元素和右指针小于pivot的元素,将区间分成大于pivot和小于pivot的 [注意] 时间复杂度取决于pi ...
- 从一组数找第K大元素
最近做面试题,经常与到一个问题,如何高效的从一组数中找到第K大的元素. 其实我们最容易想到的肯定是蛮力法. 1. 我们可以对这个乱序数组按照从大到小先行排序,然后取出前k大,总的时间复杂度为O(n*l ...
- O(n)线性时间找第K大,中位数
运用快速排序的思想,可以达到线性时间找到一串数的第K大 #include<cstdio> #define F(i,a,b) for(int i=a;i<=b;i++) ],n; vo ...
- CSUOJ2078-查找第k大(读入挂)
查找第k大 Submit Page Output 对于每组数据,输出第k大的数 Sample Input 1 6 2 1 2 3 4 5 6 Sample Output 5 Hint #include ...
- P1049 找第K大的数
题目描述 给定一个无序正整数序列, 以及另一个数n (1<=n<=1000000), 然后以类似快速排序的方法找到序列中第n大的数(关于第n大的数:例如序列{1,2,3,4,5,6}中第3 ...
- HDU - 4006 The kth great number multiset应用(找第k大值)
The kth great number Xiao Ming and Xiao Bao are playing a simple Numbers game. In a round Xiao Ming ...
- 快排找第k大模板
int get_kth(int l,int r) { if (l==r) return a[r]; ]; while (i<j) { while (a[i]<mid) i++; while ...
随机推荐
- Zabbix 监控 Mysql 状态
简介: 如何使用 Zabbix 来监控 Mysql 状态 ? Zabbix 有自带监控 Mysql 的模板,但是却不能直接使用.. 需要我们根据模板提供的 Key 自己写脚本获取数据 1.查看都有哪些 ...
- 06002001单例模式C#实现版本
书名:设计模式之禅 作者:秦小波 出版社:机械工业出版社 1 描述 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例 2 UML类图 图1-1 单例模式类图 3 代码 Singleto ...
- go_内建变量类型
bool, string (u)int, (u)int8, (u)int16, (u)int32, (u)int64, uintptr (uintptr 是指针) byte, rune(表示字符cha ...
- Codeforces 1154G 枚举
题意:给你一堆数,问其中lcm最小的一对数是什么? 思路:因为lcm(a, b) = a * b / gcd(a, b), 所以我们可以考虑暴力枚举gcd, 然后只找最小的a和b,去更新答案即可. 数 ...
- iOS倒计时
现在开发基本上都有发送验证码,倒计时,下面说一种 #import <UIKit/UIKit.h> @interface UIButton (CountDown) -(void)startT ...
- 274. H-Index论文引用量
[抄题]: Given an array of citations (each citation is a non-negative integer) of a researcher, write a ...
- Oracle VM VirtualBox 部署CS devcloud2 开发环境
Setting up (VirtualBox) 1. Get the new DevCloud 2.0 virtual appliance. The new image was created usi ...
- porwedesigner 去掉引号
PowerDesigner生成的ORACLE 建表脚本中去掉对象的双引号,设置大.小写 若要将 CDM 中将 Entity的标识符都设为指定的大小写,则可以这么设定: 打开cdm的情况下,进入Tool ...
- 爬虫 之 scrapy-redis组件
scrapy-redis组件 scrapy-redis是一个基于redis的scrapy组件,通过它可以快速实现简单分布式爬虫程序,该组件本质上提供了三大功能: scheduler - 调度器 dup ...
- python 数据合并
1. 数据合并 前言 一.横向合并 1. 基本合并语句 2. 键值名不一样的合并 3. “两个数据列名字重复了”的合并 二.纵向堆叠 统计师的Python日记[第6天:数据合并] 前言 根据我的Pyt ...