二分。情况讨论

因为数组有序,所以能够考虑用二分。通过二分剔除掉肯定不是第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. echarts如何更改表格主题颜色

    vue项目中,需要使用echarts时,需要根据UI设计图进行图标颜色修改 方法一: 1.在script中引入echarts以及主题样式: import echarts from 'echarts'; ...

  2. ubuntu/wireshark --Lua: Error during loading: [string "/usr/share/wireshark/init.lua"]:45问题解决

    错误如下: 解决方案:修改init.lua 直接运行wireshark的话会报错: Lua: Error during loading:[string "/usr/share/wiresha ...

  3. BlogEngine.NET架构学习:Extension扩展实现

    之前有个系列文章介绍过BlogEngine.NET,其中也有关于插件的介绍:"BlogEngine.Net架构与源代码分析系列part9:开发扩展(上)--Extension与管理上的实现& ...

  4. 20130912.Windows下常用命令的使用(不断更新)

    Win+R================================ cmd => 命令行 lpksetup => 弹出安装或者卸载Windows显示语言 ipconfig => ...

  5. Java基础学习总结(59)——30 个java编程技巧

    1.return 一个空的集合,而不是 null 如果一个程序返回一个没有任何值的集合,请确保一个空集合返回,而不是空元素.这样你就不用去写一大堆 "if else" 判断null ...

  6. Ubuntu 15.10 安装Qt5.5.1

    本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50300447 本人使用的ubuntu系 ...

  7. POJ2142 The Balance (扩展欧几里德)

    本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia The Balance 题目大意  你有一个天平(天平左右两边都可以放砝码)与重量为a,b(1<= ...

  8. windows server 2008开机自动登陆无密码,关机不必写原因

    运行secpol.sec接下来,在弹出的“本地安全策略”对话框中,依次展开左边树图到“本地策略”-“安全选项”,在右边可以找到“交互式登录 无须按 Ctrl+Alt+Del”,双击该项设置为“已启用” ...

  9. java去除反复的字符串和移除不想要的字符串

    在java开发中碰到了有些字符串是反复的,假设在进行业务处理要所有遍历太对的数据就会反复,所以在进行业务处理前进行一个去重操作. watermark/2/text/aHR0cDovL2Jsb2cuY3 ...

  10. Revit二次开发实现BIM盈利(以橄榄山快模为例解说) 视频讲座下载

    应笔墨闲谈群的邀请, 在10月11号晚8:30分在其群做了一次关于BIM二次开发的讲座. 因为參与者基本上都是从设计院和施工单位来的,所以对Revit二次开发做了纵览性的解说, 以非程序猿能听懂的方式 ...