4. 寻找两个有序数组的中位数

很明显我偷了懒, 没有给出正确的算法,因为官方的解法需要时间仔细看一下。。。

func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {

	// 追加 -> 排序 -> 求中值
nums1 = append(nums1, nums2...)
if len(nums1) == 0 {
return 0.0
}
// 排序
sort.Ints(nums1)
//fmt.Println(nums1) // 求中值,偶数个求中间均值, 奇数个取中间
if len(nums1)%2 == 0{
return float64(nums1[len(nums1)/2]+nums1[len(nums1)/2-1])/2
} else {
return float64(nums1[len(nums1)/2])
} }

  

这里有 LeetCode 上大神给出的符合要求的解答:

执行时间 28ms, 大神解答:

// O(log(m + n))算法,假设第k个元素是中位数,则在nums1和nums2的混合集合中找到第k个元素
// 在nums1和nums2中各拿出k/2个元素,比较各自中最大的一个,这样每比较一次就会找到k/2个比k小的元素
// 此时在剩下的集合中查找第k/2个元素,以此类推,当k为0时就找到了中位数(但是k不会为0,只会是1,所以当k为1时比较两个序列中首元素小的那个)
// 当某个序列中所有元素都比第k个元素小时,就返回另一个队列中的第k个元素
func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
len := len(nums2) + len(nums1)
k := len / 2
if len % 2 == 0 {
return (helper(nums1, 0, nums2, 0, k + 1) + helper(nums1, 0, nums2, 0, k)) / 2.0
} else {
return helper(nums1, 0, nums2, 0, k + 1)
}
} /*
* 依据上面的算法查找中位数
* n,m分别记录nums1和nums2在哪个位置之前的数据已被筛选
*/
func helper(nums1 []int, n int, nums2 []int, m int, k int) float64{
if n >= len(nums1){
return float64(nums2[m + k - 1])
} else if m >= len(nums2) {
return float64(nums1[n + k - 1])
}
if k == 1{
a := math.Min(float64(nums1[n]), float64(nums2[m]))
return a
} p1 := n + k/2 - 1
p2 := m + k - k/2 - 1
var mid1, mid2 int
if p1 >= len(nums1) {
mid2 = nums2[p2]
mid1 = mid2 + 1
} else if p2 >= len(nums2) {
mid1 = nums1[p1]
mid2 = mid1 + 1
} else {
mid1 = nums1[p1]
mid2 = nums2[p2]
} if mid1 < mid2 {
k = k - (p1 + 1 - n)
if k == 0{
return float64(mid2)
}
return helper(nums1, p1+1, nums2, m, k)
} else {
k = k - (p2 + 1 - m)
if k == 0{
return float64(mid1)
}
return helper(nums1, n, nums2, p2+1, k)
}
}

   LeetCode 深似海。。。

LeetCode Golang 4. 寻找两个有序数组的中位数的更多相关文章

  1. leetcode题目4.寻找两个有序数组的中位数(困难)

    题目描述: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和  ...

  2. 【LeetCode】4. 寻找两个有序数组的中位数

    给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2  ...

  3. 【LeetCode 4】寻找两个有序数组的中位数

    题目链接 [题解] 假设在两个有序的序列中找第k小的数字. 那么我们先定位第一个序列中的第k/2个数字(不足则取最边上的那个数字)记下标为i1 然后定位第二个序列中的第k/2个数字(同样不足则取最边上 ...

  4. Leetcode(4)寻找两个有序数组的中位数

    Leetcode(4)寻找两个有序数组的中位数 [题目表述]: 给定两个大小为 m 和 n 的有序数组 nums1 和* nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O( ...

  5. Java实现 LeetCode 4 寻找两个有序数组的中位数

    寻找两个有序数组的中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 n ...

  6. 0004. 寻找两个有序数组的中位数(Java)

    4. 寻找两个有序数组的中位数 https://leetcode-cn.com/problems/median-of-two-sorted-arrays/ 最简单的就是用最简单的,把两个数组分别抽出然 ...

  7. 【LeetCode】寻找两个有序数组的中位数【性质分析+二分】

    给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 ...

  8. leetcode -- 寻找两个有序数组的中位数

    题目: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nu ...

  9. LeetCode寻找两个有序数组的中位数

    题目: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nu ...

随机推荐

  1. [洛谷 P1967] 货车运输 (最大生成树 lca)

    题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...

  2. Oracle与Mysql内嵌游标的使用示例

    Oracle 游标用For循环比较简单,Mysql也是最近才开始用,感觉稍微麻烦一点,下边直接上代码: ------------------------------------------------ ...

  3. Yii2.0 RESTful API 认证教程

    认证介绍 和Web应用不同,RESTful APIs 通常是无状态的, 也就意味着不应使用 sessions 或 cookies, 因此每个请求应附带某种授权凭证,因为用户授权状态可能没通过 sess ...

  4. qt4.7.0 交叉编译环境搭建经验总结

    一.前期软件准备: 1 .虚拟机fedora9.到fedora官网下载,地址 http://fedoraproject.org/   版本推荐使用fedora9,在vm内安装,并且不安装vmware ...

  5. Problem 9

    Problem 9 # Problem_9.py """ A Pythagorean triplet is a set of three natural numbers, ...

  6. 2015 Multi-University Training Contest 8 hdu 5381 The sum of gcd

    The sum of gcd Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  7. 使用joomla通过CSV文件上传数据存入数据库并使用JavaScript验证码是否符合规则

    1,实现效果截图 2,A.php上传CSV文件表单 2-1:html结构使用jqeury.form.min.js表单框架异步提交 <div class="uploadFile bord ...

  8. 自己定义控件三部曲之动画篇(十三)——实现ListView Item进入动画

    前言:宝剑锋从磨砺出,梅花香自苦寒来 相关文章: <Android自己定义控件三部曲文章索引>: http://blog.csdn.net/harvic880925/article/det ...

  9. XTU1201:模和除

    题目描写叙述 两个整数x和y,满足1<=x<=a,1<=y<=b 且x%y等于x/y的x和y的对数有多少? x%y是x除以y的余数, x/y是x除以y的商,即整数除. 输入 不 ...

  10. SharePoint 2013 开启訪问请求

    1.通常,我们进入SharePoint 2013网站,假设没权限会提示该网站未被共享,而没有切换账号或者申请訪问,实在是非常流氓:事实上,SharePoint为我们提供了訪问请求页面.可是可能须要手动 ...