package main //方法二:二分查找 // 时间复杂度度要求为O(logN),很容易就想到了二分查找。 // 算法是思路为,先定位到两个数组的中位数,比较此时两个中位数对应的数的大小,再根据结果去进行调整, // 以数组1不超出范围为循环条件,每次比较区间范围的中位数的大小,将left1和left2这两个指针始终指向可能的中位数的位置,因为数组是从小到大进行排序的。 func findMedianinTwoSortedAray(arr1 []int, arr2 []int) int { len := len(arr1) if len == 1 { return min(arr1[0], arr2[0]) } l1, r1, l2, r2 := 0, len-1, 0, len-1 mid1, mid2, even := 0, 0, 0 //用于记录每轮中间的指针和当前子区间是否为偶数 for l1 < r1 { even = (r1 - l1) % 2 //区间长度偶数为1,奇数为0 mid1 = (l1 + r1) >> 1 //求第一个数组中间指针 mid2 = (l2 + r2) >> 1 //求第二个数组中间指针 if arr1[mid1] == arr2[mid2] { return arr1[mid1] //若是子区间中间值相等,则直接返回数值 } else if arr1[mid1] < arr2[mid2] { //当一个子区间的中值小于另一个区间的中值时 l1 = mid1 + even //我们取较小中值区间的右半部分,注意长度为偶数的子区间中值后一位才是右半部分的起点 r2 = mid2 //取较大中值区间的左半部分 } else { //以下同理 l2 = mid2 + even r1 = mid1 } } return min(arr1[l1], arr2[l2]); //此时两个指针指向排序后中间的两个数,只需返回其中较小的数 } func min(a, b int) int { if a > b { return b } return a }