Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
刷题打卡第4天第4篇。
勤学似春起之苗,不见其增,日有所长;辍学如磨刀之石,不见其损,日有所亏。
掘金的活动真多哇,这个月决定每天用go刷题,一方面提升一下算法水平,另一方面沉淀一下go语言的学习。
Let's GO!
题目描述
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
示例
示例 1:
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
示例 2:
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
提示:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-106 <= nums1[i], nums2[i] <= 106
解题思路
这道题很简单,不管是题目说明还是提示都给出了我们解题思路。
-
首先我们需要把给定的两个有序数组进行合并
-
分两种情况来求出中位数:
2.1 一种情况是长度是偶数,则中位数是中间两个数之和再除以2得到中位数;
2.2 另一种情况是合并后的数组长度是奇数,则最中间的元素就是我们要找到的中位数。
AC代码
func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
len1 := len(nums1)
len2 := len(nums2)
lenSum := len1+len2
if lenSum == 0 {
return float64(0)
}
l, r := 0, 0
a := make([]int,0,lenSum)
for l <len1 && r < len2{
if nums1[l] < nums2[r]{
a = append(a,nums1[l])
l++
}else {
a = append(a, nums2[r])
r++
}
}
a = append(a, nums1[l:]...)
a = append(a, nums2[r:]...)
if lenSum%2 != 0 {
return float64(a[lenSum/2])
}else {
return (float64(a[lenSum/2-1]) + float64(a[lenSum/2]))/2
}
}
运行结果
总结
刷题还是讲究先易后难的,今天这道题就是比较简单好上手的。之前刷的有一道难题对我这种刚开始刷题的同学实在不友好,差点要放弃~
来源声明
来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/me…
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
最后
感谢阅读,欢迎大家三连:点赞、收藏、投币(关注)!!!