lc-go/solutions/0/q4/solution.go
2026-02-01 14:48:00 +09:00

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