【雅虎笔试题】两个已经排好序的数组,找中位数

简介: 来源:http://www.cnblogs.com/qi09/archive/2011/10/18/2216844.html 题目:现在有两个排好序的整数数组,a[N]和b[N],要求写一个函数,功能为返回两个数组中第N大数和第N+1大数的中间值,即求解两者的和除以2。

来源:http://www.cnblogs.com/qi09/archive/2011/10/18/2216844.html

题目:现在有两个排好序的整数数组,a[N]和b[N],要求写一个函数,功能为返回两个数组中第N大数和第N+1大数的中间值,即求解两者的和除以2。

函数原型:double getMedian( int a[], int b[] );

下面,我们先来分析一个类似的问题,假设a和b都是升序的,分别有n1和n2个元素,求两个数组合并后第k大元素值。

分别取两个数组中间索引的数,a[x]和b[y],比较两个数的大小:

if( a[x] <= a[y] )

——————————————————————————————————————————————————————————————

如果k <= x+y+1,则可以判断出b[y]以及b[y]后面的元素都可以排除在外,减小搜索规模。

如果k  > x+y+1,则可以判断出a数组的前半部分元素都不符合条件,减少a一半的搜索规模。

该算法利用了递归的思想,结束条件是:

a中元素排除出去,则选择b中得第k大元素;

b中元素全部排除,选择a中第k大元素。

——————————————————————————————————————————————————————————————

实现的代码如下:

复制代码
#include <stdio.h>
#include <stdlib.h>
#define N 5

int a[N] = {1, 2, 3, 4, 5};
int b[N] = {4, 5, 6, 7, 8};

//获取数组a中从s1到n1个元素
//数组b中s2到n2个元素,合并后的第k大元素
int getMedian( int s1, int n1, int s2, int n2, int k ) {
//x和y分别记录中间值的索引
int x, y;

x = (s1 + n1) / 2; //记录a的中位数索引
y = (s2 + n2) / 2; //记录b的中位数索引

if( s1 > n1 )
return b[s2+k-1];
if( s2 > n2 )
return a[s1+k-1];

if( a[x] <= b[y] ) {
if( k <= (x-s1) + (y-s2) + 1 ) {
return getMedian( s1, n1, s2, y-1, k );
}
else {
return getMedian( x+1, n1, s2, n2, k-(x-s1)-1 );
}
}
else {
if( k <= (x-s1)+(y-s2)+1 ) {
return getMedian( s1, x-1, s2, n2, k );
}
else {
return getMedian( s1, n1, y+1, n2, k-(y-s2)-1 );
}
}

return 0;
}

int main() {
int i;
i = getMedian(0, 4, 0, 4, 5);
printf( "%d\n", i );
return 0;
}
复制代码

img_e00999465d1c2c1b02df587a3ec9c13d.jpg
微信公众号: 猿人谷
如果您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】
如果您希望与我交流互动,欢迎关注微信公众号
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

目录
相关文章
|
2月前
|
人工智能 Java
每日一题《剑指offer》数组篇之连续子数组的最大和
每日一题《剑指offer》数组篇之连续子数组的最大和
42 0
每日一题《剑指offer》数组篇之连续子数组的最大和
|
2月前
|
Java
每日一题《剑指offer》数组篇之数组中的逆序对
每日一题《剑指offer》数组篇之数组中的逆序对
32 0
每日一题《剑指offer》数组篇之数组中的逆序对
【剑指offer】-连续子数组的最大和-30/67
【剑指offer】-连续子数组的最大和-30/67
|
2月前
|
算法
六六力扣刷题数组之长度最小的子数组
六六力扣刷题数组之长度最小的子数组
31 0
|
8月前
|
算法 索引
代码随想录训练营Day2:1.有序数组的平方 2.长度最小的子数组3,螺旋矩阵
代码随想录训练营Day2:1.有序数组的平方 2.长度最小的子数组3,螺旋矩阵
16 0
|
11月前
|
算法 索引
代码随想录算法训练营第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II ,总结
代码随想录算法训练营第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II ,总结
|
C++
剑指offer 53. 数组中的逆序对
剑指offer 53. 数组中的逆序对
63 0
剑指offer 53. 数组中的逆序对
剑指offer 43. 连续子数组的最大和
剑指offer 43. 连续子数组的最大和
58 0
|
算法
美团算法面试题【数组实现二分、三数和、求n进制】
美团算法面试题【数组实现二分、三数和、求n进制】
91 0
美团算法面试题【数组实现二分、三数和、求n进制】
|
算法
LeetCode 04寻找两个正序数组的中位数(困难)二分法
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。 请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1 和 nums2 不会同时为空。
98 0
LeetCode 04寻找两个正序数组的中位数(困难)二分法