在Go(Golang)中找出两个排序数组的中位数的方法

288 阅读2分钟

概述

目的是返回两个排序数组的中间值。例如,如果输入是

[1,5]
[3,4,6]

那么中位数是4,因为如果我们对两个数组进行排序,那么4就在中间。

[1,3,4,5,6]

如果总元素的数量是偶数呢。也就是说,如果两个数组的总长度是偶数。在这种情况下,中位数是

(n/2 + (n/2 +1 ))/2

其中n是两个数组的总长度

例如,如果输入的是

[1,2]
[3,4]

那么中位数是**(2+3)/2=2.5**,因为如果我们对两个数组进行排序,那么2和3就在中间。

[1,2,3,4]

因此,如果两个数组的总长度为n,那么有两种情况

  • 如果n是奇数,那么中位数就在n/2+1的位置上

  • 如果n是偶数,那么中位数在**(n/2+(n/2+1))/2**的位置。

程序

package main

import "fmt"

func main() {
	median := findMedianSortedArrays([]int{1, 2}, []int{3, 4})
	fmt.Println(median)
}

func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
	firstArrayLen := len(nums1)
	secondArrayLen := len(nums2)

	var mid int
	i := 0
	j := 0
	var k int
	mid = (firstArrayLen+secondArrayLen)/2 + 1

	//This is the case in which the total lenght of two arrays is odd and there is only one median
	if (firstArrayLen+secondArrayLen)%2 == 1 {
		var median float64

		for k < mid {
			if i < firstArrayLen && j < secondArrayLen {
				if nums1[i] <= nums2[j] {
					median = float64(nums1[i])
					i++
					k++
				} else {
					median = float64(nums2[j])
					j++
					k++
				}
			} else if i < firstArrayLen {
				median = float64(nums1[i])
				i++
				k++
			} else {
				median = float64(nums2[j])
				j++
				k++
			}

		}
		return median
	} else { //This is the case in which the total lenght of two arrays is even and there is only two medians. We need to return average of these two medians
		var median1 float64
		var median2 float64

		for k < mid {
			median1 = median2
			if i < firstArrayLen && j < secondArrayLen {
				if nums1[i] <= nums2[j] {
					median2 = float64(nums1[i])
					i++
					k++
				} else {
					median2 = float64(nums2[j])
					j++
					k++
				}
			} else if i < firstArrayLen {
				median2 = float64(nums1[i])
				i++
				k++
			} else {
				median2 = float64(nums2[j])
				j++
				k++
			}

		}
		return (median1 + median2) / 2
	}
}

输出

2.5