[LeetCode]Median of Two Sorted Arrays 二分查找两个有序数组的第k数(中位数)
二分。情况讨论
因为数组有序,所以能够考虑用二分。通过二分剔除掉肯定不是第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数(中位数)的更多相关文章
- 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 ...
- Leetcode 4 Median of Two Sorted Arrays 二分查找(二分答案+二分下标)
貌似是去年阿里巴巴c++的笔试题,没有什么创新直接照搬的... 题意就是找出两个排序数组的中间数,其实就是找出两个排序数组的第k个数. 二分答案,先二分出一个数,再用二分算出这个数在两个排序数组排序第 ...
- 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) { ; ...
- Leetcode#88. Merge Sorted Array(合并两个有序数组)
题目描述 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 m ...
- [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 ...
- 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 ...
- 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 ...
- [leetcode]Median of Two Sorted Arrays @ Python
原题地址:https://oj.leetcode.com/problems/median-of-two-sorted-arrays/ 题意:There are two sorted arrays A ...
随机推荐
- java类的属性
类的嵌套!!!!!!!!!! 首先我们创建一个学生卡卡号的一个类,这个类有两个属性,校园卡号和银行卡号 package cuteSnow; public class StudentCard { pub ...
- oracle 控制语句
PL输出语句 set serverout on; -- 开启PL的输出语句功能declare n number:=1; -- 声明一个number型的变量n,并赋值为1 v varchar2(20): ...
- 6.between...and...
6.在WHERE中使用between...and... 用于区间值的条件判断(包含边界值) //查询工资在2000(包含)到3000(包含)之间的员工信息 select empno,e ...
- NYIST 1107 最高的奖励
最高的奖励 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 请问:挖掘机技术哪家强?AC了告诉你! 给你N(N<=3*10^4)个任务,每个任务有一个截止完成时 ...
- HDU 4333 Contest 4
一开始就想到了扩展KMP,因为只有扩展KMP才是处理后缀的.但忽然短路以为扩展KMP求的是最长公共后缀,囧....又浪费了很多时间,都是对这个算法练得不多 再看那个扩展KMP算法之后,就很确定要的就是 ...
- 浅谈SaaS应用开发的难度
近期做SaaS应用的非常多,这样的模式是未来的一种趋势,这样的模式的最大优点就是云计算的优点--节约资源.网上有非常多人觉得SaaS非常easy,就是一个多用户租赁模式.这样的认识也不能说不正确.由于 ...
- AspNet WebApi 中应用fo-dicom抛出异常:No codec registered for tranfer syntax:
背景: 在做一个Dicom Web Service, 当中WADO-RS中须要解析TransferSyntax, 然后就用到了fo-dicom中的DicomFile.ChangeTransferSyn ...
- poj--2549--Sumsets(二分查找)
Sumsets Time Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Submit Statu ...
- 正则表达式匹配 C++实现 java实现 leetcode系列(十一)
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符 '*' 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 ...
- sts安装出现could not find jar:file解决办法,could not find jar:file,sts安装
标题sts插件下载好但是安装出错 我的eclipse是4.5.2,在官方网站https://spring.io/tools3/sts/legacy下载,压缩包的名字为:spring-tool-suit ...