两个有序数组中的中位数以及求第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 ...
随机推荐
- 为Linux技术学习推荐看的书籍—《Linux就该这么学》
成长,是一种经历:经历,是一种人生的体验.人生的意义不在于我们拥有了什么,而在于从中我们体悟了什么.在这短短的三年,却在我的人生中弥足珍贵,在脑海中记忆犹新,在这大学三年里,我从一个莽撞少年成长为一名 ...
- librdkafka安装和php扩展php-rdkafka安装
1.安装librdkafka mac下 brew install librdkafka linux下 git clone https://github.com/edenhill/librdkafk ...
- Vuejs的$watch实现原理
大概原理如下面代码所示: class Vue { //Vue对象 constructor (options) { this.$options=options; let data = this._dat ...
- leetcode python 009
##懒得自己做 ## 验证回文数字int0=63435435print(int(str(int0)[::-1])==int)
- echarts.init 使用jq获取初始化对象
var myChart = echarts.init($('#main')[0]);// 或者var myChart = echarts.init($('#main').get(0));
- Vue编译提示警告
There are multiple modules with names that only differ in casing.有多个模块同名仅大小写不同This can lead to unexp ...
- ipa 注入 dylib
前些日子再github找到了一个内存修改器 DLGMemor 免越狱在app内植入修改器,感觉很不错,就尝试去看看是否可行. 用到的工具: Xcode 10. optool 首先要做的,安装 opt ...
- Linux删除软链接
首先我们先来创建一个文件 #mkdir test_chk #touch test_chk/test.txt #vim test_chk/test.txt (这一步随便在这个test.txt里写点东东即 ...
- ChIP-seq motif ROC 相关资料
[怪毛匠子]独家整理 不可以转载 MEME工具 http://meme-suite.org DNA motif 搜索算法总结 http://www.bbioo.com/lifesciences/40- ...
- web(五)CSS引入方式,编写规范及调试
CSS (Cascading Style Sheets)层叠样式表 ,是由万维网联盟(W3C)制定的标准 CSS的主要作用: 美化html元素的外观,例如设定背景颜色.字体等. 对网页元素进行布局.以 ...