LeetCode Golang 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. 寻找两个有序数组的中位数的更多相关文章
- leetcode题目4.寻找两个有序数组的中位数(困难)
题目描述: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 ...
- 【LeetCode】4. 寻找两个有序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 ...
- 【LeetCode 4】寻找两个有序数组的中位数
题目链接 [题解] 假设在两个有序的序列中找第k小的数字. 那么我们先定位第一个序列中的第k/2个数字(不足则取最边上的那个数字)记下标为i1 然后定位第二个序列中的第k/2个数字(同样不足则取最边上 ...
- Leetcode(4)寻找两个有序数组的中位数
Leetcode(4)寻找两个有序数组的中位数 [题目表述]: 给定两个大小为 m 和 n 的有序数组 nums1 和* nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O( ...
- Java实现 LeetCode 4 寻找两个有序数组的中位数
寻找两个有序数组的中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 n ...
- 0004. 寻找两个有序数组的中位数(Java)
4. 寻找两个有序数组的中位数 https://leetcode-cn.com/problems/median-of-two-sorted-arrays/ 最简单的就是用最简单的,把两个数组分别抽出然 ...
- 【LeetCode】寻找两个有序数组的中位数【性质分析+二分】
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 ...
- leetcode -- 寻找两个有序数组的中位数
题目: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nu ...
- LeetCode寻找两个有序数组的中位数
题目: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nu ...
随机推荐
- vc++如何创建程序-构造函数
如果给Animal带参,则提示没有缺省的构造函数了,缺省就是不带参数的 改进:从子类当中向基类传递代参的,这样他就会给Animal传递400,300 对一个常量来调用 #include<iost ...
- 路飞学城Python-Day171
Evernote Export 线性结构: python的列表操作 列表是如何存储的:顺序存储的,是一块连续的内存,内存是一堆格子,列表是一串连续的编号 32位机器上一个整数占4个字节 数组和列表有2 ...
- Bzoj2124(p5364): 等差子序列
题目描述 给一个1到N的排列{Ai},询问是否存在1<=p1<p2<p3<p4<p5<…<pLen<=N (Len>=3), 使得Ap1,Ap2, ...
- Project Euler 44 Sub-string divisibility( 二分 )
题意:五边形数由公式Pn=n(3n−1)/2生成,在所有和差均为五边形数的五边形数对Pj和Pk中,找出使D = |Pk − Pj|最小的一对:此时D的值是多少? 思路:二分找和差 /********* ...
- gud-cloud
架构:计算层:三台机器,包含处理器,内存条,外加一个64GB的存储器,这个存储器安装exsi主机,然后创建cvm虚拟机,硬盘空间选择在之前安装exsi主机的存储器里面 存储层:三台机器内置多个硬盘8T ...
- docker-compose,docker-machine,docker swarm 的简单总结
1.docker-compose: 用来在单机上启动一组应用服务.这个服务中可能包含有很多应用,比如你的app服务,redis,mysql,等等. (1)我们需要先创建好docker-compose的 ...
- rtsp://admin:12345@192.168.1.198/mpeg4/main/ch01/av_stream
rtsp://admin:12345@192.168.1.198/mpeg4/main/ch01/av_stream
- Problem 8
Problem 8 # Problem_8.py """ The four adjacent digits in the 1000-digit number that h ...
- 最短路&查分约束
[HDU] 1548 A strange lift 根蒂根基最短路(或bfs)★ 2544 最短路 根蒂根基最短路★ 3790 最短路径题目 根蒂根基最短路★ 2066 一小我的观光 根蒂根基最短路( ...
- BA-水阀接线(图)
220V水阀接线