减治算法之寻觅两个递增序列的中位数
减治算法之寻找两个递增序列的中位数
一、问题描述
寻找两个递增序列的中位数。
本算法中只能解决两个序列长度规模相等的问题,若两个序列长度规模不相等,则可以先做合并(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