1. 题目
2. 题目解答
2.1 解1
答案1是我自己的解法,较为暴力,直接将两个数组合并为一个并对其进行排序,排序后根据索引获取对应的中位数,具体代码如下:
func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
var res float64
nums1 = append(nums1,nums2...)
sort.Ints(nums1)
l := len(nums1)
var index int = l/2
if l%2==0 {
res = float64(nums1[index-1]+nums1[index])/2
}else{
res = float64(nums1[index])
}
return res
}
提交结果如下
2.2 解2(参考官方答案)
使用二分查找进行解答,设两个数组长度分别为m和n,目标在于在两个数组中找位于(m+n)/ 2+1 的数字(m+n为奇数)或者位于(m+n)/2和(m+n)/2+1的数字(m+n为偶数)。
令 k=(m+n)/2,两个数组分别为A和B,算法基本思路如下:
1)迭代内容:比较A[k/2]以及B[k/2]
(1)A[k/2]<=B[k/2] :去除A[0:k/2]的元素(注意:这里要注意去除的元素个数是否超过了数组的实际长度),k = k-k/2
(2)A[k/2] > B[k/2] :去除B[0:k/2]的元素(同样要注意数组的长度),k = k-k/2
2)迭代停止:在以下两种情况下可停止迭代
(1)有一个数组为空:存在一个数组除去元素后,数组为空,返回另一个数组的第k个元素
(2)k=1:比较两个数组当前的第一个元素,返回其中较小的元素
具体代码如下:
func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
totalLength := len(nums1)+len(nums2)
mid := totalLength/2
if totalLength%2 == 0{
return (KthGet(nums1, nums2, mid)+KthGet(nums1, nums2, mid+1))/2.0
}else{
return KthGet(nums1, nums2, mid+1)
}
}
func KthGet(nums1, nums2 []int, k int) float64{
indexA, indexB := 0, 0 // index作为两个数组每次搜索起始位置
for{
// 依次判断是否满足结束条件
if indexA == len(nums1){
return float64(nums2[indexB + k-1])
}
if indexB == len(nums2){
return float64(nums1[indexA + k-1])
}
if k == 1{
return float64(GetMin(nums1[indexA],nums2[indexB]))
}
halfK := k/2
indexAt := GetMin(indexA+halfK, len(nums1))
indexBt := GetMin(indexB+halfK, len(nums2))
if nums1[indexAt-1]<=nums2[indexBt-1]{
k = k-(indexAt-indexA)
indexA = indexAt
}else{
k = k-(indexBt-indexB)
indexB = indexBt
}
}
}
func GetMin(a, b int) int{
if a<=b{
return a
}else{
return b
}
}
提交结果如下