解法参考

《【分步详解】两个有序数组中的中位数和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个最小数的值的更多相关文章

  1. 【分步详解】两个有序数组中的中位数和Top K问题

    (这也是一道leetcode的经典题目:<LeetCode>解题笔记:004. Median of Two Sorted Arrays[H] 问题介绍 这是个超级超级经典的分治算法!!这个 ...

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

  3. 查找两个有序数组中的第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) { ; ...

  4. 选取两个有序数组中最大的K个值,降序存入另一个数组中

    原题: 假设有两个有序的整型数组int *a1, int *a2,长度分别为m和n.试用C语言写出一个函数选取两个数组中最大的K个值(K可能大于m+n)写到int *a3中,保持a3降序,并返回a3实 ...

  5. [转载]寻找两个有序数组中的第K个数或者中位数

    http://blog.csdn.net/realxie/article/details/8078043 假设有长度分为为M和N的两个升序数组A和B,在A和B两个数组中查找第K大的数,即将A和B按升序 ...

  6. 两个有序数组的上中位数和第K小数问题

    哈,再介绍个操蛋的问题.当然,网上有很多解答,但是能让你完全看懂的不多,即便它的结果是正确的,可是解释上也是有问题的. 所以,为了以示正听,我也做了分析和demo,只要你愿意学习,你就一定能学会,并且 ...

  7. LeetCode 4——两个排序数组中的中位数

    1. 题目 2. 解答 2.1. 方法一 由于两个数组都是排好序的,因此首先可以想到的思路就是利用归并排序把两个数组合并成一个有序的长数组,然后直接取出中位数即可. class Solution: d ...

  8. 两个有序数组中查找第K大数

    题目:两个数组A.B,长度分别为m.n,即A(m).B(n),分别是递增数组.求第K大的数字.   方法一: 简单的办法,使用Merge Sort,首先将两个数组合并,然后在枚举查找.这个算法的时间复 ...

  9. 【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 ...

随机推荐

  1. linux c使用socket进行http 通信,并接收任意大小的http响应(五)

    http.c data2.c http_url.c http.h data2.h http_url.h主要实现的功能是通过URL结构体来实现HTTP通信,你可以把这三个文件独立出来,作为HTTP通信模 ...

  2. day41-python多进程多线程-多线程共享

    线程共享变量多线程和多进程不同之处在于多线程本身就是可以和父进程共享内存的,这也是为什么其中一个线程挂掉以后,为什么其他线程也会死掉的道理. import threading def worker() ...

  3. M0内核的STM32实现比较精准的延时

    #include "drv_delay.h"#include "core_cm0plus.h" //我的系统时钟设置为4MHz /*************** ...

  4. NPOI 操作excel之 将图片插入到指定位置;

    //新建类 重写Npoi流方法 public class NpoiMemoryStream : MemoryStream { public NpoiMemoryStream() { AllowClos ...

  5. 关于Java的特点之多态

    多态--概念 所谓多态,就是指一个引用(类型)在不同情况下的多种状态.也可以理解成:多态是指通过指向父类的指针,来调用在不同子类中实现的方法. 实现多态有两种方式:1.继承:2.接口 多态--注意事项 ...

  6. Java语法基础学习DayFourteen(IO)

    一.java.io.FIle类 1.特点 (1)凡是与输入.输出相关的类.接口等都定义在java.io包下. (2)File是一个类,使用构造器创建对象,此对象对应一个文件(.txt .avi .do ...

  7. Markup解析XML——文档,说明

    链接:http://pan.baidu.com/s/1slMwEc9 密码:slz7 上面是网盘的地址,因为来源已经找不到了,在这里给这个作者说声谢谢. 轻量级的XML解析器使用比较简单,下载Mark ...

  8. 【转】FMX 动态创建及销毁(释放free)对象

    http://www.2pascal.com/thread-3037-1-1.html这是原文地址. (* ********************************************** ...

  9. SamplesHashtable

    using System; using System.Collections; public class SamplesHashtable { public static void Main() { ...

  10. React Native Android打包apk

    按照官方的5步曲: 1.在终端里面,cd 到项目的根目录后.执行下面这行命令: keytool -genkey -v -keystore my-release-key.keystore -alias ...