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. vc++如何创建程序-构造函数

    如果给Animal带参,则提示没有缺省的构造函数了,缺省就是不带参数的 改进:从子类当中向基类传递代参的,这样他就会给Animal传递400,300 对一个常量来调用 #include<iost ...

  2. 路飞学城Python-Day171

    Evernote Export 线性结构: python的列表操作 列表是如何存储的:顺序存储的,是一块连续的内存,内存是一堆格子,列表是一串连续的编号 32位机器上一个整数占4个字节 数组和列表有2 ...

  3. Bzoj2124(p5364): 等差子序列

    题目描述 给一个1到N的排列{Ai},询问是否存在1<=p1<p2<p3<p4<p5<…<pLen<=N (Len>=3), 使得Ap1,Ap2, ...

  4. Project Euler 44 Sub-string divisibility( 二分 )

    题意:五边形数由公式Pn=n(3n−1)/2生成,在所有和差均为五边形数的五边形数对Pj和Pk中,找出使D = |Pk − Pj|最小的一对:此时D的值是多少? 思路:二分找和差 /********* ...

  5. gud-cloud

    架构:计算层:三台机器,包含处理器,内存条,外加一个64GB的存储器,这个存储器安装exsi主机,然后创建cvm虚拟机,硬盘空间选择在之前安装exsi主机的存储器里面 存储层:三台机器内置多个硬盘8T ...

  6. docker-compose,docker-machine,docker swarm 的简单总结

    1.docker-compose: 用来在单机上启动一组应用服务.这个服务中可能包含有很多应用,比如你的app服务,redis,mysql,等等. (1)我们需要先创建好docker-compose的 ...

  7. rtsp://admin:12345@192.168.1.198/mpeg4/main/ch01/av_stream

    rtsp://admin:12345@192.168.1.198/mpeg4/main/ch01/av_stream

  8. Problem 8

    Problem 8 # Problem_8.py """ The four adjacent digits in the 1000-digit number that h ...

  9. 最短路&查分约束

    [HDU] 1548 A strange lift 根蒂根基最短路(或bfs)★ 2544 最短路 根蒂根基最短路★ 3790 最短路径题目 根蒂根基最短路★ 2066 一小我的观光 根蒂根基最短路( ...

  10. BA-水阀接线(图)

    220V水阀接线