There are two sorted arrays nums1 and nums2 of size m and n respectively.
Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
You may assume nums1 and nums2 cannot be both empty.
Example 1:
nums1 = [1, 3]
nums2 = [2]
The median is 2.0
Example 2:
nums1 = [1, 2]
nums2 = [3, 4]
The median is (2 + 3)/2 = 2.5
思路:
查找两个有序数组的中间的元素,可以转化成查找两个有序数组的第k个元素(言外之意,就是找到 k-1个较小的元素)。则需要将 nums1 的第pa个元素与 nums2 的第pb个元素进行比较,其中,pa + pb =k。
1、若nums1[pa - 1] < nums2[pb - 1],则 nums1的pa 个元素必定在 k - 1 个较小的元素中,则可去掉 nums1 的 pa 个元素
2、若nums1[pa - 1] > nums2[pb - 1],则 nums2的pb 个元素必定在 k - 1 个较小的元素中,则可去掉 nums2 的 pb 个元素
3、若 nums1[pa - 1] == nums[pb - 1],则 nums1 中的 pa - 1 个较小元素以及 nums2 中的 pb - 1 个较小的元素必定在 k - 1 个较小的元素中。
pa - 1 + pb - 1 = k - 2。其目的是,寻找k-1个较小的元素,则nums1[pa - 1] 便是要找的元素
package main
import "fmt"
func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
len1 := len(nums1)
len2 := len(nums2)
if (len1 + len2)%2 == 1 {
ret := findKNum(nums1, 0, len(nums1) - 1, nums2, 0, len(nums2) - 1,(len1 + len2)/2 + 1)
return float64(ret)
} else {
ret1 := findKNum(nums1, 0, len(nums1) - 1, nums2, 0, len(nums2) - 1,(len1 + len2)/2 )
ret2 := findKNum(nums1, 0, len(nums1) - 1, nums2, 0, len(nums2) - 1,(len1 + len2)/2 + 1)
return float64(ret1 + ret2)/2
}
}
func findKNum(nums1 []int, beg1 int, end1 int, nums2 []int, beg2 int, end2 int, k int) int {
len1 := end1 - beg1 + 1
len2 := end2 - beg2 + 1
if (len1 > len2){
return findKNum(nums2, beg2, end2, nums1, beg1, end1, k)
}
if (len1 == 0){
return nums2[beg2 + k - 1]
}
if (k == 1){
if (nums1[beg1] < nums2[beg2]){
return nums1[beg1]
}
return nums2[beg2]
}
pa := len1
if (k/2 < len1){
pa = k/2
}
pb := k - pa
if (nums1[beg1 + pa - 1] < nums2[beg2 + pb - 1]){
return findKNum(nums1, beg1 + pa , end1, nums2, beg2, end2, k - pa)
} else if (nums1[beg1 + pa - 1] > nums2[beg2 + pb - 1]){
return findKNum(nums1, beg1, end1, nums2, beg2 + pb, end2, k - pb)
} else {
return nums1[beg1 + pa - 1]
}
}
func main() {
nums1 := []int{1, 3}
nums2 := []int{2}
ret := findMedianSortedArrays(nums1,nums2)
fmt.Println(ret)
}