| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 | 
							- package main
 
- // len(nums1) + len(nums2) != 0
 
- func 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))
 
- // }
 
 
  |