两个有序数组中的中位数以及求第k个最小数的值
解法参考
《【分步详解】两个有序数组中的中位数和Top K问题》
https://blog.csdn.net/hk2291976/article/details/51107778
里面求中位数的方法很巧妙,非常值得借鉴,这里写一个用类似思想实现 求第k个最小数的值
这里没有虚加 #,因为求k个最小数的值 不需要考虑 奇偶问题,所以更简单,代码如下:
//[2,3,5] [1 4 7 9] 第k个小的树的数,比如k=3 那么就返回3
int findTopKSortedArrays(vector<int>& nums1, vector<int>& nums2,int k){
int n = (int)nums1.size();
int m = (int)nums2.size();
if(n > m) //保证数组1一定最短
return findTopKSortedArrays(nums2,nums1,k); //先判断几个特殊情况
if(k==){
return min(nums1[],nums2[]);
}
int lo = ;
int hi=n-;//最后一个索引
//每个数组所包含的元素数目
int c1=;
int c2=;
int L1,R1,L2,R2;
while (lo<=hi) {
//先取中间索引
int midIndex=(lo+hi)/;
//第一个数组所包含的元素个数
c1 = midIndex +;
//第二个数组中所包含的元素个数
c2= k-c1;
//第一个数组确定分割
if(c1==){ //说明第一个数组里没有包含前k个小的元素
L1=INT_MIN;
}
else { // 正常情况,取中间元素作为左边界
L1= nums1[midIndex];
}
if(c1==nums1.size()){//说明第一个数组中的所有元素都在前k个
R1=INT_MAX;
}
else {//正常情况,取中间元素的右边那个作右边界
R1=nums1[midIndex+];
} //第二个数组确定分割
if(c2==){
L2=INT_MIN;
}
else {
L2= nums2[c2-];
}
if(c2==nums2.size()){
R2=INT_MAX;
}
else {
R2=nums2[c2];
} if(L1 > R2){//第一个数组应该减小
hi = midIndex-;
if(hi<){//说明 第一个数组里面没有可用的元素了,返回第二个数组的
return nums2[k-];
}
}
else if(L2 > R1){ //第二个数组的左边界大约第一个数组的有边界,说明第一个数组要右二分
lo = midIndex+;
if(lo==nums1.size()){ //说明 第一个数组里面没有可用的元素了,返回第二个数组的
return nums2[k-];
}
}
else{
break; //符合条件了,跳出
}
}
return max(nums1[c1-],nums2[c2-]); }
两个有序数组中的中位数以及求第k个最小数的值的更多相关文章
- 【分步详解】两个有序数组中的中位数和Top K问题
(这也是一道leetcode的经典题目:<LeetCode>解题笔记:004. Median of Two Sorted Arrays[H] 问题介绍 这是个超级超级经典的分治算法!!这个 ...
- Coursera Algorithms week3 快速排序 练习测验: Selection in two sorted arrays(从两个有序数组中寻找第K大元素)
题目原文 Selection in two sorted arrays. Given two sorted arrays a[] and b[], of sizes n1 and n2, respec ...
- 查找两个有序数组中的第K个元素(find kth smallest element in 2 sorted arrays)
查找两个有序数组中的第K个元素 int FindKth(int a[], int b[], int k, int astart, int aend, int bstart, int bend) { ; ...
- 选取两个有序数组中最大的K个值,降序存入另一个数组中
原题: 假设有两个有序的整型数组int *a1, int *a2,长度分别为m和n.试用C语言写出一个函数选取两个数组中最大的K个值(K可能大于m+n)写到int *a3中,保持a3降序,并返回a3实 ...
- [转载]寻找两个有序数组中的第K个数或者中位数
http://blog.csdn.net/realxie/article/details/8078043 假设有长度分为为M和N的两个升序数组A和B,在A和B两个数组中查找第K大的数,即将A和B按升序 ...
- 两个有序数组的上中位数和第K小数问题
哈,再介绍个操蛋的问题.当然,网上有很多解答,但是能让你完全看懂的不多,即便它的结果是正确的,可是解释上也是有问题的. 所以,为了以示正听,我也做了分析和demo,只要你愿意学习,你就一定能学会,并且 ...
- LeetCode 4——两个排序数组中的中位数
1. 题目 2. 解答 2.1. 方法一 由于两个数组都是排好序的,因此首先可以想到的思路就是利用归并排序把两个数组合并成一个有序的长数组,然后直接取出中位数即可. class Solution: d ...
- 两个有序数组中查找第K大数
题目:两个数组A.B,长度分别为m.n,即A(m).B(n),分别是递增数组.求第K大的数字. 方法一: 简单的办法,使用Merge Sort,首先将两个数组合并,然后在枚举查找.这个算法的时间复 ...
- 【medium】4. Median of Two Sorted Arrays 两个有序数组中第k小的数
There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...
随机推荐
- protobuf example make backup
# See README.txt. .PHONY: all cpp java python clean all: cpp #java python cpp: add_person_cpp list_p ...
- exadata cellcli
cellcli [port_number] [-n] [-m] [-xml] [-v | -vv | -vvv] [-x] [-e command] The following table lists ...
- DMSkin for WPF 开源在Github
DMSkin for WPF 开源在Github http://www.dmskin.com/
- docker-compose docker启动工具,容器互联
简介: docker可以一条命令就运行一个配置好的服务器,很是方便. 但是也有一个问题就是,当参数比较多,映射目录比较多,映射端口比较多………… 我以前就是写个脚本,用脚本来启动,很low啊. 也见到 ...
- 从零开始学Shell(一)
1.$表示普通用户,#表示超级用户.2.sh /home/path/script.sh3.chmod a+x script.sh 增加可执行权限 ./script.sh #./表示当前的 ...
- OO课程中IDEA相关插件的使用
写在前面 由于OO课程博客作业的需要分析代码的复杂度并绘制UML图,但是课件上推荐的分析工具(http://metrics.sourceforge.net )经过自己几个小时的折腾还是没有安装成功 ...
- <? extends T> <? super T>
拿前者来说,这其实就是一个指定的泛型,不过这个泛型可以是T及T的任何子类, 如果一个set方法,是把一个泛型对象T赋值给一个泛型T属性,现在这个T变成了<? extends T>,那么se ...
- makeObjectsPerformSelector对数组中的对象发送消息执行对象中方法
- (void)makeObjectsPerformSelector:(SEL)aSelector; - (void)makeObjectsPerformSelector:(SEL)aSelector ...
- 【linux基础】cuDNN版本查询
参考 1. 查看cudnn版本; 完
- 移动端键盘遮挡input问题
在开发移动端项目的时候测试提出优化问题,即: input 获取焦点弹出系统虚拟键盘时, input 被键盘遮挡问题(PS:此问题只在安卓手机上有,ios系统是有自动处理的). 解决办法为: 当 inp ...