题目:
给定两个大小分别为 m
和 n
的正序(从小到大)数组 nums1
和 nums2
。请你找出并返回这两个正序数组的 中位数 。
题解思路:
常规解法是将两个数组合并排序,然后再求中位数。考虑用快速排序或者归并排序。但又由于给定的两个数组都是有序的,优先推荐归并排序,归并一次(O(m+n))即可。排序再找中位数的解法,会增加m+n的内存开销。
归并:
func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
t := len(nums1) + len(nums2)
nums := make([]int, t)
merge(nums, nums1, nums2)
return getMedian(nums)
}
func getMedian(nums []int) float64 {
t := len(nums)
if t % 2 == 0 {
a := nums[t / 2 - 1]
b := nums[t / 2]
return (float64(a) + float64(b)) / 2
} else {
return float64(nums[t / 2])
}
}
func merge(nums []int, nums1 []int, nums2 []int) {
k := 0
i := 0
j := 0
for k < len(nums) {
if i >= len(nums1) && j < len(nums2) {
nums[k] = nums2[j]
j++
}
if j >= len(nums2) && i < len(nums1) {
nums[k] = nums1[i]
i++
}
if i < len(nums1) && j < len(nums2) {
if nums1[i] <= nums2[j] {
nums[k] = nums1[i]
i++
} else {
nums[k] = nums2[j]
j++
}
}
k++
}
}
快排:
func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
t := len(nums1) + len(nums2)
nums := make([]int, t)
n := 0
for i := 0; i < len(nums1); i++ {
nums[n] = nums1[i]
n++
}
for j := 0; j < len(nums2); j++ {
nums[n] = nums2[j]
n++
}
quickSort(nums, 0, n - 1)
return getMedian(nums)
}
func getMedian(nums []int) float64 {
t := len(nums)
if t % 2 == 0 {
a := nums[t / 2 - 1]
b := nums[t / 2]
return (float64(a) + float64(b)) / 2
} else {
return float64(nums[t / 2])
}
}
func quickSort(nums []int, lo, hi int) {
if lo >= hi {
return
}
j := partation(nums, lo, hi)
quickSort(nums, lo, j - 1)
quickSort(nums, j + 1, hi)
}
func partation(nums []int, lo, hi int ) int {
v := nums[lo]
i := lo + 1;
j := hi;
for {
for(i < hi && nums[i] <= v) {
i++
}
for (j > lo && nums[j] > v) {
j--
}
if i >= j {
break
}
if j == lo {
break
}
exch(nums, i, j)
}
exch(nums, lo, j)
return j
}
func exch(nums []int, a, b int) {
tmp := nums[a]
nums[a] = nums[b]
nums[b] = tmp
}