package q4 import "math" func findMedianSortedArrays(nums1 []int, nums2 []int) float64 { l1, l2 := len(nums1), len(nums2) even := (l1+l2)%2 == 0 if l1+l2 == 1 { if l1 == 1 { return float64(nums1[0]) } return float64(nums2[0]) } // Find how many numbers `nums1` has that are to the left of the median nLeft := (len(nums1) + len(nums2)) / 2 l, r := max(0, nLeft-l2), min(nLeft, len(nums1))+1 Loop: for l+1 < r { m := (l + r) / 2 p1 := m - 1 p2 := nLeft - m - 1 switch { case p2 >= 0 && p1+1 < l1 && nums2[p2] > nums1[p1+1]: l = m + 1 case p1 >= 0 && p2+1 < l2 && nums1[p1] > nums2[p2+1]: r = m default: l = m break Loop } } lNum, rNum := math.MinInt, math.MaxInt p1 := l - 1 p2 := nLeft - l - 1 if p1 >= 0 { lNum = max(lNum, nums1[p1]) } if p2 >= 0 { lNum = max(lNum, nums2[p2]) } if p1+1 < l1 { rNum = min(rNum, nums1[p1+1]) } if p2+1 < l2 { rNum = min(rNum, nums2[p2+1]) } if even { return float64(lNum+rNum) / 2 } return float64(rNum) } var _ = findMedianSortedArrays