一、问题描述
寻找两个递增序列的中位数。
本算法中只能解决两个序列长度规模相等的问题,若两个序列长度规模不相等,则可以先做合并(leetcode:Merge Sorted Array 【Java】)后再寻找中位数。
二、问题分析
分别计算序列A,B的中位数a,b
比较中位数a,b,会出现以下三种请款
(1)a = b,直接返回结果a
(2)a < b,两个序列的中位数只能出现在[a,b),在序列中A中删除a之前的元素形成新序列A,在序列B中删除b之后的元素形成新序列B
(3)a > b,两个序列的中位数只能出现在[b,a),在序列中A中删除a之后的元素形成新序列A,在序列B中删除b之前的元素形成新序列B
重复以上步骤。
三、算法代码
public static int searchMid(int [] a, int [] b){
if(a.length != b.length){
System.out.println("序列规模不一致,计算结果初始化为-1!");
return -1;
}
int s1 = 0;
int e1 = a.length - 1;
int s2 = 0;
int e2 = b.length - 1;
int mid1,mid2;
while(s1 < e1 && s2 < e2){
mid1 = (s1 + e1) / 2;
mid2 = (s2 + e2) / 2;
if(a[mid1] == b[mid2]){
return a[mid1];
}
if(a[mid1] < b[mid2]){
s1 = mid1 + 1;
e2 = mid2;
}else{
s2 = mid2 + 1;
e1 = mid1;
}
}
if(a[s1] < b[s2]){
return a[s1];
}else{
return b[s2];
}
}
四、完整测试代码
public class package01 {
public static void main(String [] args){
int [] a = new int[]{1,2,3,4,5,11,13};
int [] b = new int[]{6,7,8,9,10,12,14};
int result = searchMid(a, b);
System.out.print("两个递增序列的中位数为:" + result);
}
public static int searchMid(int [] a, int [] b){
if(a.length != b.length){
System.out.println("序列规模不一致,计算结果初始化为-1!");
return -1;
}
int s1 = 0;
int e1 = a.length - 1;
int s2 = 0;
int e2 = b.length - 1;
int mid1,mid2;
while(s1 < e1 && s2 < e2){
mid1 = (s1 + e1) / 2;
mid2 = (s2 + e2) / 2;
if(a[mid1] == b[mid2]){
return a[mid1];
}
if(a[mid1] < b[mid2]){
s1 = mid1 + 1;
e2 = mid2;
}else{
s2 = mid2 + 1;
e1 = mid1;
}
}
if(a[s1] < b[s2]){
return a[s1];
}else{
return b[s2];
}
}
}
五、运行结果
两个递增序列的中位数为:8