题目描述
- 给定两个有序(升序)数组arr1和arr2,已知两个数组的长度都为N,求两个数组中所有数的上中位数。
- 根据例子,上中位数指若有两个中位数,则较小的那一个是上中位数。
题解
- 分类讨论。结合使用二分,两个数组分别维护l、r、mid指针。
- arr1[mid1]=arr2[mid2],直接返回结果
- arr1[mid1]>arr2[mid2],分别去掉两个数组不可能的部分,两个数组剩余部分(一定要保持l2-l1与r2-r1相等!)继续二分。
- arr1[mid1]<arr2[mid2],同上
- 时间复杂度O(logN),空间复杂度O(1)
代码
public class Main {
public static void main(String args[]) {
int[] arr1= {1,2,3,4};
int[] arr2= {3,4,5,6};
int midian=getUpMidian(arr1,arr2);
System.out.println(midian);
}
public static int getUpMidian(int arr1[],int arr2[]) {
if(arr1==null||arr2==null||arr1.length!=arr2.length) {
throw new RuntimeException("Array is invaild!");
}
if(arr1.length==1) {
return arr1[0]<arr2[0]?arr1[0]:arr2[0];
}
int l1=0;
int l2=l1;
int r1=arr2.length-1;
int r2=r1;
while(l1<r1) {
boolean oddFlag=(r1-l1+1)%2==1?true:false;
int mid1=(l1+r1)/2;
int mid2=(l2+r2)/2;
if(arr1[mid1]==arr2[mid2]) {
return arr1[mid1];
}
else if(arr1[mid1]>arr2[mid2]) {
r1=mid1;
l2=oddFlag?mid2:mid2+1;
}
else {
r2=mid2;
l1=oddFlag?mid1:mid1+1;
}
}
return arr1[l1];
}
}