【力扣】寻找两个正序数组的中位数 [Go语言]

357 阅读2分钟

「这是我参与2022首次更文挑战的第25天,活动详情查看:2022首次更文挑战」。

1. 题目

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

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

输入: nums1 = [1,3], nums2 = [2]
输出: 2.00000
解释: 合并数组 = [1,2,3] ,中位数 2

2. 思路

关键点:两个有序数组,求两个合并数组的中位数。

  • 既然是两个有序的,我们可以直接遍历两个数组,并且可以直接遍历到mid位置即可!

  • 两个数组轮流遍历,如果a数组的值比b数组的小,那么a数组的下标index++,如果反之b数组的下标index++,因为这两个数组是有序的,可以顺序比较下去。

  • 注意的是,等一个数组比较完之后(就是已经比完了自身元素的数组),剩下另外一个有剩下元素的就不需要比较了。

  • 直接就是剩下一个数组了。那么直到中间值即可!

func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
(1)	m, n := len(nums1), len(nums2)
(2)	mid := (m+n)/2
(3)	i,j,k := 0,0,0
(4)	cur,pre := 0,0
(5)	for k <= mid {
(6)		pre = cur
(7)		if i <= m-1 && j <= n-1 {
(8)			if nums2[j] > nums1[i] {
(9)                            cur = nums1[i]
(10)                            i++
(11)			} else {
(12)                            cur = nums2[j]
(13)                            j++
(14)			}
(15)		} else if i <= m-1 {
(16)			cur = nums1[i]
(17)			i++
(18)		} else {
(19)			cur = nums2[j]
(20)			j++
(21)		}
(22)		k++
(23)	}
(24)	if (m+n)%2==1{
(25)		return float64(cur)
	}
(26)	return float64(cur+pre)/2
}
  • (1)计算两个数组的长度
  • (2)计算中间值是哪个index
  • (3)定义变量i当作num1的下标,j当作num2的下标,k当作结果的遍历的坐标。
  • (4)定义当前节点的值和当前节点的前一个值,因为可能是偶数,要前后相加/2
  • (5)当下标k小于等于中间值mid的时候进行循环,不断循环出这个结果
  • (6)先让pre等于cur先,因为cur接下来肯定会变的。
  • (7)i<m或是i<=m-1都是可以的。现在这种情况是两个数组都有值
  • (8)当num2[j]的数组的值比num1[i]大的时候
  • (9)当前的值就等于nums1[i]。
  • (10)并且让i++,继续进行比较
  • (11)如果num2[j]的数组的值比num1[i]小的时候
  • (12)当前的值就等于如果num2[j]。
  • (13)并且让j++,继续进行比较
  • (14)
  • (15)如果当j>n或是j>=n-1的时候,表示j已经超过nums[2]的长度,已经遍历完了,接下来就剩下num1[i]而已了
  • (16)那就直接遍历num1[i]就可以了!
  • (17)-(21) 逻辑和15 16是一样的
  • (22) 这个是推送cur的下标,直接接触到mid结束
  • (24) 如果这个是奇数的话
  • (25) 直接返回cur
  • (26) 如果是偶数的话,就返回(pre+cur)/2 就是前一个就当前这个/2