59 lines
1 KiB
Go
59 lines
1 KiB
Go
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
|