[程序员代码面试指南]第9章-在两个长度相等的排序数组中找到上中位数(二分)

题目描述

  • 给定两个有序(升序)数组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];
	}
}

posted on   coding_gaga  阅读(142)  评论(0编辑  收藏  举报

努力加载评论中...

导航

点击右上角即可分享
微信分享提示