Files
LeetCode-Go/leetcode/0004.Median-of-Two-Sorted-Arrays/4. Median of Two Sorted Arrays.go
2020-08-07 17:06:53 +08:00

58 lines
1.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package leetcode
func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
// 假设 nums1 的长度小
if len(nums1) > len(nums2) {
return findMedianSortedArrays(nums2, nums1)
}
low, high, k, nums1Mid, nums2Mid := 0, len(nums1), (len(nums1)+len(nums2)+1)>>1, 0, 0
for low <= high {
// nums1: ……………… nums1[nums1Mid-1] | nums1[nums1Mid] ……………………
// nums2: ……………… nums2[nums2Mid-1] | nums2[nums2Mid] ……………………
nums1Mid = low + (high-low)>>1 // 分界限右侧是 mid分界线左侧是 mid - 1
nums2Mid = k - nums1Mid
if nums1Mid > 0 && nums1[nums1Mid-1] > nums2[nums2Mid] { // nums1 中的分界线划多了,要向左边移动
high = nums1Mid - 1
} else if nums1Mid != len(nums1) && nums1[nums1Mid] < nums2[nums2Mid-1] { // nums1 中的分界线划少了,要向右边移动
low = nums1Mid + 1
} else {
// 找到合适的划分了,需要输出最终结果了
// 分为奇数偶数 2 种情况
break
}
}
midLeft, midRight := 0, 0
if nums1Mid == 0 {
midLeft = nums2[nums2Mid-1]
} else if nums2Mid == 0 {
midLeft = nums1[nums1Mid-1]
} else {
midLeft = max(nums1[nums1Mid-1], nums2[nums2Mid-1])
}
if (len(nums1)+len(nums2))&1 == 1 {
return float64(midLeft)
}
if nums1Mid == len(nums1) {
midRight = nums2[nums2Mid]
} else if nums2Mid == len(nums2) {
midRight = nums1[nums1Mid]
} else {
midRight = min(nums1[nums1Mid], nums2[nums2Mid])
}
return float64(midLeft+midRight) / 2
}
func max(a int, b int) int {
if a > b {
return a
}
return b
}
func min(a int, b int) int {
if a > b {
return b
}
return a
}