递归

	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大的更多相关文章

  1. 找第k大的数

    (找第k大的数) 给定一个长度为1,000,000的无序正整数序列,以及另一个数n(1<=n<=1000000),接下来以类似快速排序的方法找到序列中第n大的数(关于第n大的数:例如序列{ ...

  2. 快速排序算法的实现 && 随机生成区间里的数 && O(n)找第k小 && O(nlogk)找前k大

    思路:固定一个数,把这个数放到合法的位置,然后左边的数都是比它小,右边的数都是比它大 固定权值选的是第一个数,或者一个随机数 因为固定的是左端点,所以一开始需要在右端点开始,找一个小于权值的数,从左端 ...

  3. luogu_P1177 【模板】快速排序 (快排和找第k大的数)

    [算法] 选取pivot,然后每趟快排用双指针扫描(l,r)区间,交换左指针大于pivot的元素和右指针小于pivot的元素,将区间分成大于pivot和小于pivot的 [注意] 时间复杂度取决于pi ...

  4. 从一组数找第K大元素

    最近做面试题,经常与到一个问题,如何高效的从一组数中找到第K大的元素. 其实我们最容易想到的肯定是蛮力法. 1. 我们可以对这个乱序数组按照从大到小先行排序,然后取出前k大,总的时间复杂度为O(n*l ...

  5. O(n)线性时间找第K大,中位数

    运用快速排序的思想,可以达到线性时间找到一串数的第K大 #include<cstdio> #define F(i,a,b) for(int i=a;i<=b;i++) ],n; vo ...

  6. CSUOJ2078-查找第k大(读入挂)

    查找第k大 Submit Page Output 对于每组数据,输出第k大的数 Sample Input 1 6 2 1 2 3 4 5 6 Sample Output 5 Hint #include ...

  7. P1049 找第K大的数

    题目描述 给定一个无序正整数序列, 以及另一个数n (1<=n<=1000000), 然后以类似快速排序的方法找到序列中第n大的数(关于第n大的数:例如序列{1,2,3,4,5,6}中第3 ...

  8. 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 ...

  9. 快排找第k大模板

    int get_kth(int l,int r) { if (l==r) return a[r]; ]; while (i<j) { while (a[i]<mid) i++; while ...

随机推荐

  1. Zabbix 监控 Mysql 状态

    简介: 如何使用 Zabbix 来监控 Mysql 状态 ? Zabbix 有自带监控 Mysql 的模板,但是却不能直接使用.. 需要我们根据模板提供的 Key 自己写脚本获取数据 1.查看都有哪些 ...

  2. 06002001单例模式C#实现版本

    书名:设计模式之禅 作者:秦小波 出版社:机械工业出版社 1 描述 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例 2 UML类图 图1-1 单例模式类图 3 代码 Singleto ...

  3. go_内建变量类型

    bool, string (u)int, (u)int8, (u)int16, (u)int32, (u)int64, uintptr (uintptr 是指针) byte, rune(表示字符cha ...

  4. Codeforces 1154G 枚举

    题意:给你一堆数,问其中lcm最小的一对数是什么? 思路:因为lcm(a, b) = a * b / gcd(a, b), 所以我们可以考虑暴力枚举gcd, 然后只找最小的a和b,去更新答案即可. 数 ...

  5. iOS倒计时

    现在开发基本上都有发送验证码,倒计时,下面说一种 #import <UIKit/UIKit.h> @interface UIButton (CountDown) -(void)startT ...

  6. 274. H-Index论文引用量

    [抄题]: Given an array of citations (each citation is a non-negative integer) of a researcher, write a ...

  7. Oracle VM VirtualBox 部署CS devcloud2 开发环境

    Setting up (VirtualBox) 1. Get the new DevCloud 2.0 virtual appliance. The new image was created usi ...

  8. porwedesigner 去掉引号

    PowerDesigner生成的ORACLE 建表脚本中去掉对象的双引号,设置大.小写 若要将 CDM 中将 Entity的标识符都设为指定的大小写,则可以这么设定: 打开cdm的情况下,进入Tool ...

  9. 爬虫 之 scrapy-redis组件

    scrapy-redis组件 scrapy-redis是一个基于redis的scrapy组件,通过它可以快速实现简单分布式爬虫程序,该组件本质上提供了三大功能: scheduler - 调度器 dup ...

  10. python 数据合并

    1. 数据合并 前言 一.横向合并 1. 基本合并语句 2. 键值名不一样的合并 3. “两个数据列名字重复了”的合并 二.纵向堆叠 统计师的Python日记[第6天:数据合并] 前言 根据我的Pyt ...