二分。情况讨论

因为数组有序,所以能够考虑用二分。通过二分剔除掉肯定不是第k位数的区间。如果数组A和B当前处理的下标各自是mid1和mid2。则

1、假设A[mid1]<B[mid2],

①、若mid1+mid2+2==k(+2是由于下标是从0開始的),则

mid1在大有序数组中下标肯定小于k,所以能够排除[0,mid1]。此外。B[mid2]下标大于或等于k。能够排除[mid2+1,n];

②、若mid1+mid2+2<k,则

mid1在大有序数组中下标肯定小于k,所以能够排除[0,mid1]

③、若mid1+mid2+2>k,则

B[mid2]下标大于k,能够排除[mid2,n];

2、假设A[mid1]<B[mid2]情况相符,仅仅是下标改变。

这些操作处理完后。可能一个数组被排除了,即满足lowX>highX。此时仅仅需对还有一个数组进行二分,同一时候二分其元素在还有一个数组中的下标,确定全局下标,终于通过推断全局下标与k的关系。确定是否为第k数

class Solution {
public:
int findPos(int* p,int n,int x){
int low=0,high=n-1,mid;
while(low<=high){
mid=(low+high)>>1;
if(p[mid]<=x)low=mid+1;
else high=mid-1;
}
return low;
}
double findK(int a[], int m, int b[], int n,int k){
int mid1,mid2,low1=0,low2=0,high1=m-1,high2=n-1,x;
while(low1<=high1&&low2<=high2){
mid1=(high1+low1)>>1;
mid2=(high2+low2)>>1;
if(a[mid1]<b[mid2]){
if(mid1+mid2+2==k){
low1=mid1+1;
high2=mid2;
}
else if(mid1+mid2+2<k){
low1=mid1+1;
}
else high2=mid2-1;
}
else{
if(mid1+mid2+2==k){
low2=mid2+1;
high1=mid1;
}
else if(mid1+mid2+2<k){
low2=mid2+1;
}
else high1=mid1-1;
}
}
if(low1<=high1){
// if(low1==high1)return a[low1];
while(low1<=high1){
mid1=(low1+high1)>>1;
x=findPos(b,n,a[mid1]);
if(x+mid1+1==k)return a[mid1];
else if(x+mid1<k)low1=mid1+1;
else high1=mid1-1;
}
return low1>=m?a[m-1]:a[low1];
}
else {
// if(low2==high2)return b[low2];
while(low2<=high2){
mid2=(low2+high2)>>1;
x=findPos(a,m,b[mid2]);
if(x+mid2+1==k)return b[mid2];
else if(x+mid2<k)low2=mid2+1;
else high2=mid2-1;
}
return low2>=n? a[n-1]:b[low2];
}
}
double findMedianSortedArrays(int a[], int m, int b[], int n) {
int k=m+n;
if(k&1){
return findK(a,m,b,n,k/2+1);
}
else{
return (findK(a,m,b,n,k/2)+findK(a,m,b,n,k/2+1))/2.0;
}
}
};

[LeetCode]Median of Two Sorted Arrays 二分查找两个有序数组的第k数(中位数)的更多相关文章

  1. 4. Median of Two Sorted Arrays *HARD* -- 查找两个排序数组的中位数(寻找两个排序数组中第k大的数)

    There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...

  2. Leetcode 4 Median of Two Sorted Arrays 二分查找(二分答案+二分下标)

    貌似是去年阿里巴巴c++的笔试题,没有什么创新直接照搬的... 题意就是找出两个排序数组的中间数,其实就是找出两个排序数组的第k个数. 二分答案,先二分出一个数,再用二分算出这个数在两个排序数组排序第 ...

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

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

  5. Leetcode#88. Merge Sorted Array(合并两个有序数组)

    题目描述 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 m ...

  6. [LeetCode] Median of Two Sorted Arrays 两个有序数组的中位数

    There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...

  7. Leetcode Median of Two Sorted Arrays

    There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted ...

  8. LeetCode: Median of Two Sorted Arrays 解题报告

    Median of Two Sorted Arrays There are two sorted arrays A and B of size m and n respectively. Find t ...

  9. [leetcode]Median of Two Sorted Arrays @ Python

    原题地址:https://oj.leetcode.com/problems/median-of-two-sorted-arrays/ 题意:There are two sorted arrays A ...

随机推荐

  1. unity 获取UGUI中的Text字的坐标

    using System.Collections; using UnityEngine; using UnityEngine.UI; public class TextMoveHelper : Mon ...

  2. js滚动事件实现滚动触底加载

    移动端触底加载时前端开发过程中常用功能,主要是通过三个值的大小来进行判断: 首先介绍jquery的写法,代码如下: $(window).scroll(function(){ var windowH=$ ...

  3. Springboot 应用启动分析

    https://blog.csdn.net/hengyunabc/article/details/50120001#comments 一,spring boot quick start 在spring ...

  4. jsoup抓取网页+具体解说

    jsoup抓取网页+具体解说 Java 程序在解析 HTML 文档时,相信大家都接触过 htmlparser 这个开源项目.我以前在 IBM DW 上发表过两篇关于 htmlparser 的文章.各自 ...

  5. 使用Ant打包Android应用具体解释

    计划写个完整的使用Ant打包Android应用的系列文章.三篇文章.首篇具体介绍採用Ant打包Android应用的流程.列出部分定制问题及其解决方法,第二篇介绍我理解的Ant打包的思路与主要的概念和使 ...

  6. 编写shell脚本获取本机的网络地址。&#160; 比方:本机的ip地址是:192.168.100.2/255.255.255.0,那么它的网络地址是&#160;192.168.100.1/255.255.255.

    ubuntu@ubuntu:~$ vim getlocalip.sh #!/bin/bash #ifconfig | grep inet | awk '$2' | awk -F : '$2' IP=` ...

  7. IP地址正則表達式

    正則表達式对字符进行格式化匹配.一句指令完毕推断. IP地址格式   x.x.x.x x 表示0~255的数字 分三种情况 A.          250-255:特点:三位数,百位是2,十位是5,个 ...

  8. the process android.process.acore has stopped或the process com.phone。。。。

    模拟器一启动 The process android.process.acore has stopped unexpectedly 今天不知道怎么回事,模拟器一启动就狂报错, 模拟器已经重新安装过了, ...

  9. bzoj3275: Number(最小割)

    3275: Number 题目:传送门 题解: 双倍经验@bzoj3158 代码: #include<cstdio> #include<cstring> #include< ...

  10. bzoj1202: [HNOI2005]狡猾的商人(差分约束)

    1202: [HNOI2005]狡猾的商人 题目:传送门 题解: 据说是带权并查集!蒟蒻不会啊!!! 可是听说lxj大佬用差分约束A了,于是开始一通乱搞. 设s[i]为前i个月的总收益,那么很容易就可 ...