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 ...
随机推荐
- MySQL_基本操作
sql语句 Sql语句主要用于存取数据,查询数据,更新数据和管理数据库系统. #Sql语句分为3种类型 #1.DDL语句:数据库定义语言: 数据库.表.视图.索引.存储过程,例如CREATE DROP ...
- Spring中xml文档的schema约束
最开始使用Spring框架的时候,对于其配置文件xml,只是网上得知其使用方法,而不明其意.最近想着寻根问底的探究一下.以下是本文主要内容: 1.配置文件示例. <?xml version= ...
- SQL增删改
USE sqlxx CREATE TABLE ygb( sid INT, sname VARCHAR(20), sgender VARCHAR(2), sbirthday DATE, semail V ...
- 【hdu 6351】Beautiful Now
[链接] 我是链接,点我呀:) [题意] 你可以最多交换k次数字. 让你组成一个最大的和一个最小的数字. [题解] 直接写个bfs.求出所有状态的最小交换次数. 但是最大值和最小值分开写. 做最大值的 ...
- botot framework选择下拉框
1,下拉框不能输入文字,如图: 方法: select from list id=xxx 要选择的数据 2.下拉框可输入文字,如图: 方法: click element di=xxx ...
- linux网络监控脚本
http://www.51testing.com/html/92/77492-828434.html
- oracle schema彻底理解
oracle中的Schema简析 在一个数据库中可以有多个应用的数据表,这些不同应用的表可以放在不同的schema之中,同时,每一个schema对应一个用户,不同的应用可以以不同的用户连接数据库,这样 ...
- 香蕉派 Banana pi BPI-M2 四核开源单板计算机.
Banana PI BPI-M2 是一款四核高性能单板计算机,Banana PI BPI-M2是一款比树莓派更强悍的四核Android4.4产品. Banana PI BPI-M2兼容性强大,能 ...
- 对thinkpad太失望了
本来本着对thinkpad的信任买的,结果买回来一直吱吱吱吱响个不停. 好像是磁盘的问题,太垃圾了. http://benyouhui.it168.com/thread-1111376-1-1.htm ...
- Shell简单介绍
Shell是一种具备特殊功能的程序.它是介于使用者和linux 操作系统之核心程序(kernel)间的一个接口.为什么我们说 shell 是一种介于系统核心程序与使用者间的中介者呢?读过操作系统概论的 ...