「这是我参与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