leetcode-4. 寻找两个正序数组的中位数
leetcode-4. 寻找两个正序数组的中位数。
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。
请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。
示例 1:
nums1 = [1, 3]
nums2 = [2]
则中位数是 2.0
示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
则中位数是 (2 + 3)/2 = 2.5
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法一: 辅助数组对原来的两数组进行归并。
double findMedianSortedArrays( int *nums1, int nums1Size, int *nums2, int nums2Size ) {
double answer = 0.0;
int i1 = 0, i2 = 0, ti = 0, *tempArray = NULL;
tempArray = malloc( sizeof(*tempArray) * (nums1Size + nums2Size) );
while( i1 < nums1Size && i2 < nums2Size ) {
tempArray[ti++] = nums1[i1] <= nums2[i2] ? nums1[i1++] : nums2[i2++];
}
while( i1 < nums1Size ) {
tempArray[ti++] = nums1[i1++];
}
while( i2 < nums2Size ) {
tempArray[ti++] = nums2[i2++];
}
answer = (ti & 1) ? tempArray[ti / 2] * 2 : tempArray[ti / 2] + tempArray[ti / 2 - 1];
free( tempArray );
return answer / 2.0;
}
解法二:模拟归并过程。
其实并不需要将两数组合并, 只需要找到中位数在位置即可.
double findMedianSortedArrays( int *nums1, int nums1Size, int *nums2, int nums2Size ) {
int lasttime = 0, current = 0, len = nums1Size + nums2Size;
int half = len / 2;
for( int i1 = 0, i2 = 0, i = 0; i <= half; ++i ) {
lasttime = current; // 记录中位数上一次的位置的值.
if( i2 >= nums2Size || (i1 < nums1Size && nums1[i1] <= nums2[i2]) ) {
current = nums1[i1++];
} else if( i2 < nums2Size ) {
current = nums2[i2++];
}
}
return len & 1 ? current : (lasttime + current) / 2.0;
}
解法三:求中位数其实就是求第 k 小数的一种特殊情况。
前面解法的遍历过程中每次只去掉一个不可能是中位数的元素,
由于数列是有序的,其实完全可以一半一半的排除,
假设要找第 k 小的元素, 遍历过程中每次排除掉 k/2 个元素.
参考:
https://leetcode-cn.com/problems/median-of-two-sorted-arrays/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-w-2/
#define MIN( a, b ) ((a) <= (b) ? (a) : (b))
static int recursion( int a[], int aSize, int b[], int bSize, int k ) {
int kc2 = k / 2;
int ai = MIN( aSize, kc2 ) - 1, bi = MIN( bSize, kc2 ) - 1;
if( aSize < 1 || bSize < 1 ) {
return aSize < 1 ? b[k - 1] : a[k - 1];
}
if( k < 2 ) {
return MIN( a[0], b[0] );
}
if( a[ai] <= b[bi] ) {
return recursion( a + MIN( aSize, ai + 1 ), aSize - (ai + 1), b, bSize, k - (ai + 1) );
}
return recursion( a, aSize, b + MIN( bSize, bi + 1 ), bSize - (bi + 1), k - (bi + 1) );
}
double findMedianSortedArrays( int *nums1, int nums1Size, int *nums2, int nums2Size ) {
int len = nums1Size + nums2Size;
double answer = 0.0;
// 假设数组共有7个元素, 则:
// 中位数 = (第4个元素 + 第4个元素) / 2.0.
// 中位数 = (第(8/2)个元素 + 第(9/2)个元素) / 2.0.
// 假设数组共有8个元素, 则:
// 中位数 = (第4个元素 + 第5个元素) / 2.0.
// 中位数 = (第(9/2)个元素 + 第(10/2)个元素) / 2.0.
// 数组的元素数量不管是奇数还是偶数,
// 中位数都为 (第((len+1)/2)个元素 + 第((len+2)/2)个元素) / 2.0.
answer += recursion( nums1, nums1Size, nums2, nums2Size, (len + 1) / 2 );
answer += recursion( nums1, nums1Size, nums2, nums2Size, (len + 2) / 2 );
return answer / 2.0;
}
leetcode-4. 寻找两个正序数组的中位数的更多相关文章
- 微软面试题: LeetCode 4. 寻找两个正序数组的中位数 hard 出现次数:3
题目描述: 给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的中位数. 进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决 ...
- [LeetCode]4.寻找两个正序数组的中位数(Java)
原题地址: median-of-two-sorted-arrays 题目描述: 示例 1: 输入:nums1 = [1,3], nums2 = [2] 输出:2.00000 解释:合并数组 = [1, ...
- leetcode 刷题(数组篇)4题 寻找两个正序数组的中位数(二分查找)
题目描述 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的 中位数 . 示例 1: 输入:nums1 = [1,3], nums2 = ...
- Leetcode随缘刷题之寻找两个正序数组的中位数
我一上来没读清题,想着这题这么简单,直接就上手写了: package leetcode.day_12_05; import java.util.ArrayList; import java.util. ...
- leetcode 4. Median of Two Sorted Arrays 寻找两个正序数组的中位数(困难)
一.题目大意 标签: 查找 https://leetcode.cn/problems/median-of-two-sorted-arrays 给定两个大小分别为 m 和 n 的正序(从小到大)数组 n ...
- 【LeetCode】4. Median of Two Sorted Arrays 寻找两个正序数组的中位数
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:数组,中位数,题解,leetcode, 力扣,python ...
- Leetcode4. 寻找两个正序数组的中位数
> 简洁易懂讲清原理,讲不清你来打我~ 输入两个递增数组,输出中位数数组 nums1 和 nums2.请你找出并返回这两个正序数组的 中位数 . 示例说明请见LeetCode官网. ...
- 寻找两个已序数组中的第k大元素
寻找两个已序数组中的第k大元素 1.问题描述 给定两个数组与,其大小分别为.,假定它们都是已按照增序排序的数组,我们用尽可能快的方法去求两个数组合并后第大的元素,其中,.例如,对于数组,.我们记第大的 ...
随机推荐
- Python下将一般对象打印成Json
有的时候,我们在写Python程序的时候,在处理复杂对象的时候,有的时候过程中调试,需要去看看产生的对象如何,有的时候我们可以把它打印成json来看,这个是个不错的办法. 对每一个对象写一个独立的打印 ...
- TCP的分分合合(面试必问)
TCP连接与断开 目录 TCP连接与断开 前言 握手 挥手 最后 前言 相信面试过的小伙伴对这个话题应该不陌生,算是面试必问了,三次握手,四次挥手,以及其中的一些衍生问题. TCP/IP(Transm ...
- 在数组添加元素时报错:IndexError: list index out of range
今天第一次发随笔还有许多不足之处,欢迎评论!!! 最近在写一个成语接龙的小游戏,结果在数组添加元素时报错:IndexError: list index out of range 源码: import ...
- 解决vue element table行列不齐问题
全局加入如下样式即可(app.vue): body .el-table th.gutter{ display: table-cell!important; }
- PHP函数:array_rand
array_rand() - 从数组中随机取出一个或多个单元. 说明: array_rand ( array $array [, int $num = 1 ] ) : mixed 参数: array ...
- Spring Cloud+nacos+Feign,实现注册中心及配置中心
写在前面 注册中心.配置中心的概念就不在这里解释了.发现服务原来一直用的是Eureka,因为这家伙闭源了,不爽.然后就发现了nacos,阿里巴巴的,好东西,一个搞定注册中心和配置中心.官网:https ...
- Python 开发工具链全解
可能刚开始学习Python时,有人跟你说可以将源文件所在的文件夹添加到 PYTHONPATH环境变量中,然后可以从其他位置导入此代码.在大多数情况下,这个人常常忘记补充这是一个非常糟糕的主意.有些人在 ...
- pytorch 中LSTM模型获取最后一层的输出结果,单向或双向
单向LSTM import torch.nn as nn import torch seq_len = 20 batch_size = 64 embedding_dim = 100 num_embed ...
- 十分钟搞懂Elasticsearch数字搜索原理
更多精彩内容请看我的个人博客或者扫描二维码,关注微信公众号:佛西先森 前言 Elasticsearch诞生的本意是为了解决文本搜索太慢的问题,ES会默认将所有的输入内容当作字符串来理解,对于字段类型是 ...
- Caused by:java.lang.ClassNotFoundException:org.apache.hadoop.yarn.util.Apps
错误原因 缺少hadoop-yarn.jar包. 导入jar包就好了~-~