标题:4寻找两个正序数组中的中位数-困难
题目
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
示例1
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
示例2
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
提示
- nums1.length == m
- nums2.length == n
- 0 <= m <= 1000
- 0 <= n <= 1000
- 1 <= m + n <= 2000
- -106 <= nums1[i], nums2[i] <= 106
代码Go
func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
var ans float64
len1 := len(nums1)
len2 := len(nums2)
allLen := len1 + len2
if allLen%2 != 0 {
// 处理 奇数个元素
ans = solveOdd(nums1, nums2, int(allLen/2))
} else {
// 处理 偶数个元素
ans = solveEven(nums1, nums2, int(allLen/2))
}
return ans
}
func solveOdd(nums1 []int, nums2 []int, num int) float64 {
res := 0.0
index1 := 0
index2 := 0
for i := 0; i <= num; i++ {
if index1 >= len(nums1) {
res = float64(nums2[index2])
index2++
continue
}
if index2 >= len(nums2) {
res = float64(nums1[index1])
index1++
continue
}
if nums1[index1] > nums2[index2] {
res = float64(nums2[index2])
index2++
} else {
res = float64(nums1[index1])
index1++
}
}
return res
}
func solveEven(nums1 []int, nums2 []int, num int) float64 {
res := 0.0
pre := 0.0
index1 := 0
index2 := 0
for i := 0; i <= num; i++ {
if index1 >= len(nums1) {
pre = res
res = float64(nums2[index2])
index2++
continue
}
if index2 >= len(nums2) {
pre = res
res = float64(nums1[index1])
index1++
continue
}
if nums1[index1] > nums2[index2] {
pre = res
res = float64(nums2[index2])
index2++
} else {
pre = res
res = float64(nums1[index1])
index1++
}
}
return (res + pre) / 2.0
}