| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 | package main// len(nums1) + len(nums2) != 0func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {	// Use i, j to divide A, B into 2 parts, like	// [A(0), ... , A(i-1), | A(i), ... , A(m)] and	// [B(0), ... , B(j-1), | B(j), ... , B(n)],	// then the left part of A and B is left, the right	// part is right, when max(left) <= min(right) &&	// len(left) == len(right), we can find the median by	// median = [max(left) + min(right)] / 2	m, n := len(nums1), len(nums2)	// if m < n, i ~ [0, m], j = (m+n+1)/2 - i	if m > n { // if m > n, swap nums1, nums2		nums1, nums2, m, n = nums2, nums1, n, m	}	ibeg, iend, halfLen := 0, m, (m+n+1)/2	var i, j int	for ibeg <= iend {		i = (ibeg + iend) / 2		j = halfLen - i		if i > 0 && nums1[i-1] > nums2[j] { // A[i-1]'s too big, ie. i's too big			iend = i - 1		} else if i < m && nums2[j-1] > nums1[i] { // i's too small			ibeg = i + 1		} else {			// i, j is found (A[i-1] <= B[j] && B[j-1] <= A[i])			var maxOfLeft, minOfRight int			if i == 0 { // find max of left				maxOfLeft = nums2[j-1]			} else if j == 0 {				maxOfLeft = nums1[i-1]			} else {				maxOfLeft = nums1[i-1]				if nums2[j-1] > maxOfLeft {					maxOfLeft = nums2[j-1]				}			}			if (m+n)%2 != 0 { // if odd, return max of left as median (!!!)				return float64(maxOfLeft)			}			if i == m { // find min of right				minOfRight = nums2[j]			} else if j == n {				minOfRight = nums1[i]			} else {				minOfRight = nums1[i]				if nums2[j] < nums1[i] {					minOfRight = nums2[j]				}			}			return float64(maxOfLeft+minOfRight) / 2		}	}	return -1 // not found, useless}// func main() {// 	nums1 := []int{1, 3}// 	nums2 := []int{2}// 	fmt.Println(findMedianSortedArrays(nums1, nums2))// 	nums3 := []int{}// 	nums4 := []int{1}// 	fmt.Println(findMedianSortedArrays(nums3, nums4))// }
 |