GO實現:leetcode之尋找兩個正序陣列的中位數

Kris_u發表於2020-11-27

問題描述:

給定兩個大小為m和n的正序(從小到大)陣列nums1和nums2。

請你找出這兩個正序陣列的中位數,並且要求演算法的時間度複雜度為O(log(m+n))

你可以假設nums1和nums2不會同時為空。

  • 示例1:

nums1 = [1,3]

nums2 = [2]

則中位數為2.0

  • 示例2:

nums1 = [1,2]

nums2 = [3,4]

則中位數為(2+3)/2 = 2.5

解法一:簡單粗暴,將兩個陣列合並,兩個有序陣列的合併也是歸併排序的一部分,然後根據奇數還是偶數,返回中位數。

func main() {
	nums1 := []int{1, 3}
	nums2 := []int{2}
	midian := findMidianNumSortedArrays(nums1, nums2)
	println("midian", midian)
}

func findMidianNumSortedArrays(nums1 []int, nums2 []int) int {
	len1 := len(nums1)
	len2 := len(nums2)
	t := len1 + len2
	if len1 == 0 { //其中一個陣列為空
		return findMidianNum(nums2)
	}
	if len2 == 0 {
		return findMidianNum(nums1)
	}
	i, j := 0, 0 //兩陣列均為非空
	nums := []int{}
	for count := 0; count < (t); count++ {
		if i == len1 {
			if j < len2 { //陣列nums1被訪問完,陣列nums2沒訪問完
				s2 := nums2[j:len2]
				nums = append(nums, s2...)
				break
			}
		}
		if j == len2 {
			if i < len1 { //陣列nums2被訪問完,陣列nums1沒訪問完
				s1 := nums1[i:len1]
				nums = append(nums, s1...)
				log.Info("nums,s1", nums, s1)
				break
			}
		}
		if nums1[i] < nums2[j] { //歸併排序的思想
			nums = append(nums, nums1[i])
			i++
		} else {
			nums = append(nums, nums2[j])
			j++
		}
	}
	midian := findMidianNum(nums)
	return midian
}

func findMidianNum(num []int) (mid int) {
	if len(num)%2 == 0 {
		mid = (num[len(num)/2] + num[len(num)/2-1]) / 2
	} else {
		mid = num[(len(num)-1)/2]
	}
	return mid
}

 

相關文章