4_困难_寻找两个正序数组的中位数

4:寻找两个正序数组的中位数

https://leetcode.cn/problems/median-of-two-sorted-arrays/

算法:

// date 2022-09-09
func findMedianSortedArrays(nums1, nums2 []int) float64 {
	s1, s2 := len(nums1), len(nums2)
	total := s1+s2
	if total == 0 {
		return 0
	}
	targetIdx := total/2
	onlyOne := total % 2 == 1
	// 如果nums1为空,在nums2中查找中位数	
	if s1 == 0 {
		if onlyOne {
			return float64(nums2[targetIdx])
		} else {
			return (float64(nums2[targetIdx-1]) + float64(nums2[targetIdx]))/2
		}
	}
	// 如果nums2为空,在nums1中查找中位数
	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
	// 开始遍历并记录pre,cur
	// nidx为合成数组的索引
	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
}

最后更新于