给定两个大小分别为 m
和 n
的正序(从小到大)数组 nums1
和 nums2
。请你找出并返回这两个正序数组的 中位数 。
没有用另外的数组缓存实现
func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
var ret float64
ret = 0
length1 := len(nums1)
length2 := len(nums2)
if length1 == 0 && length2 == 0 {
return ret
}
//即求nums2的中位数
if length1 == 0 {
ret = GetMedianNum(nums2)
return ret
}
//即求nums1的中位数
if length2 == 0 {
ret = GetMedianNum(nums1)
return ret
}
length_total := length1 + length2
if length_total % 2 == 0 {
index := length_total / 2 - 1
//转为求第index小的值和index+1的值
i := 0
j := 0
for (i+j) < index && (i<length1 || j<length2) {
if i == length1 { //防止越界
j++
} else if j == length2 {
i++
}else {
if(nums1[i] < nums2[j]) {
i++
} else {
j++
}
}
}
//nums1和nums2都没遍历完
if i != length1 && j != length2 {
if nums1[i] == nums2[j] {
ret = float64(nums1[i])
} else if nums1[i] < nums2[j] {
if i + 1 != length1 && nums1[i+1] <= nums2[j] {
ret = (float64(nums1[i]) + float64(nums1[i+1]))/2
} else {
ret = (float64(nums1[i]) + float64(nums2[j]))/2
}
} else {
if j + 1 != length2 && nums2[j+1] <= nums1[i] {
ret = (float64(nums2[j]) + float64(nums2[j+1]))/2
} else {
ret = (float64(nums1[i]) + float64(nums2[j]))/2
}
}
} else if i == length1 {
ret = (float64(nums2[j]) + float64(nums2[j+1]))/2
} else if j == length2 {
ret = (float64(nums1[i]) + float64(nums1[i+1]))/2
}
} else {
index := length_total / 2
//转为求第index小的值
i := 0
j := 0
for (i+j) < index && (i<length1 || j<length2) {
if i == length1 { //防止越界
j++
} else if j == length2 {
i++
}else {
if(nums1[i] < nums2[j]) {
i++
} else {
j++
}
}
}
//nums1和nums2都没遍历完
if i != length1 && j != length2 {
if nums1[i] < nums2[j] {
ret = float64(nums1[i])
} else {
ret = float64(nums2[j])
}
} else if i == length1 { //说明nums1被遍历完
ret = float64(nums2[j])
} else if j == length2 {
ret = float64(nums1[i]) //说明nums2被遍历完
}
}
return ret
}
// 求一个数组的中位数
func GetMedianNum(nums []int) float64 {
var ret float64
ret = 0
length := len(nums)
if length % 2 == 0 {
ret = (float64(nums[length/2-1]) + float64(nums[length/2]))/2
} else {
ret = float64(nums[length/2])
}
return ret
}