这道题的结果:
这道题如果不限制时间复杂度的话,其实很简单的,把两个数组合并下:
如果是奇数,就取中间的值。
如果是偶数,就获取中间两个数的平均值。
然而,如果这么简单,有什么值得考验的???
本题最主要的考点就是时间复杂度要小于两个数组的长度之和。假设数组nums1的长度是m,nums2的长度是n,则计算的时间复杂度不可以大于m+n,也就是说正常把两个数组遍历一下,就要出结果。
这块也考察了一个数学知识点,如何获取固定长度的中间值。因为go语言的数组index是从0开始的,故:
left := (sum - 1) /2
right := sum / 2
对应其他数组索引从1开始的,
left := (sum + 1) /2
right := (sum + 2) / 2
获取到left 和 right位置后,可以开始遍历两个数组,获取到值后进行平均。最后上代码:
func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
sum := len(nums1) + len(nums2)
left := (sum - 1) / 2
right := sum / 2
if len(nums1) <= 0 {
return float64(nums2[left] + nums2[right]) / 2
}
if len(nums2) <= 0 {
return float64(nums1[left] + nums1[right]) / 2
}
dataLeft := 0
dataRight := 0
r1 := 0
r2 := 0
span := 0
for {
data := 0
if nums1[r1] > nums2[r2] {
data = nums2[r2]
r2++
} else {
data = nums1[r1]
r1++
}
if span == left {
dataLeft = data
}
if span == right {
dataRight = data
break
}
if r1 >= len(nums1) {
if span < left {
dataLeft = nums2[r2 + left - span - 1]
}
dataRight = nums2[r2 + right - span - 1]
break
}
if r2 >= len(nums2) {
if span < left {
dataLeft = nums1[r1 + left - span - 1]
}
dataRight = nums1[r1 + right - span - 1]
break
}
span++
}
return float64(dataRight + dataLeft) / 2
}