004 寻找两个正序数组中的中位数-困难

题目:

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。

算法的时间复杂度应该为 O(log (m+n)) 。

分析:

// date 2023/11/01
func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
	s1, s2 := len(nums1), len(nums2)
	total := s1+s2
	if total == 0 {
		return 0
	}
	targetIdx := total/2
	onlyOne := total % 2 == 1
	if s1 == 0 {
		if onlyOne {
			return float64(nums2[targetIdx])
		} else {
			return (float64(nums2[targetIdx-1]) + float64(nums2[targetIdx]))/2
		}
	}
	if s2 == 0 {
		if onlyOne {
			return float64(nums1[targetIdx])
		} else {
			return (float64(nums1[targetIdx-1]) + float64(nums1[targetIdx]))/2
		}
	}

	pre, cur := 0, 0
	i, j, nIdx := 0, 0, 0
	for i < s1 && j < s2 {
		if nums1[i] < nums2[j] {
			pre, cur = cur, nums1[i]
			i++
		} else {
			pre, cur = cur, nums2[j]
			j++
		}
		if nIdx == targetIdx {
			if onlyOne {
				return float64(cur)
			}
			return (float64(pre)+float64(cur))/2
		}
		nIdx++
	}
	for i < s1 {
		pre, cur = cur, nums1[i]
		i++
		if nIdx == targetIdx {
			if onlyOne {
				return float64(cur)
			}
			return (float64(pre)+float64(cur))/2
		}
		nIdx++
	}
	for j < s2 {
		pre, cur = cur, nums2[j]
		j++
		if nIdx == targetIdx {
			if onlyOne {
				return float64(cur)
			}
			return (float64(pre)+float64(cur))/2
		}
		nIdx++
	}

	if onlyOne {
		return float64(cur)
	}
	return (float64(pre)+float64(cur))/2
}

最后更新于