/*
两个有序数组求中位数问题;
这个题有很多方法:
方法一:排序,找到中位数;
方法二:归并排序的思想
方法三:转换成求第k小值
*/
/*
思路:使用二分查找,时间复杂度为log(m+n). 该方法的核心是将原问题转变成
一个寻找第k小数的问题(假设两个原序列升序排列),
这样中位数实际上是第(m+n)/2小的数。所以只要解决了第k小数的 问题,
原问题也得以解决。首先假设数组A和B的元素个数都大于k/2,
我们比较A[k/2-1]和B[k/2-1]两个元素,这两个元素分别表示A的第k /2小的元素
和B的第k/2小的元素。这两个元素比较共有三种情况:>、<和=。
如果A[k/2-1]<B[k/2-1],这表示 A[0]到A[k/2-1]的元素都在A和B合并之后的前k小的元素中。
换句话说,A[k/2-1]不可能大于两数组合并之后的第k小值,所以我们可以将 其抛弃。
*/
#include<iostream>
using namespace std;
double findKth(int a[], int m, int b[], int n, int k)
{
if (m>n)
{
return findKth(b,n,a,m,k);
}
if (m==0)
{
return b[k-1];
}
if (k==1)
{
return min(a[0], b[0]);
}
int pa = min(k/2, m);
int pb = k - pa;
if (a[pa-1]<b[pb-1])
{
return findKth(a+pa, m-pa, b, n, k-pa);
}
else if (a[pa-1]>b[pb-1])
{
return findKth(a, m, b+pb, n-pb, k-pb);
}
else
{
return a[pa-1];
}
}
class Solution
{
double findMedian(int A[], int m, int B[], int n)
{
int total = m + n;
if (total&0x1)
{
return findKth(A, m, B, n, total/2+1);
}
else
{
return (findKth(A, m, B, n, total / 2) + findKth(A,m,B,n,total/2+1))/2;
}
}
};
共1条
1/1 1 跳转至页
两个有序数组求中位数
共1条
1/1 1 跳转至页
回复
我要赚赏金打赏帖 |
|
|---|---|
| 基于MCP23S17的输入输出功能模块控制被打赏¥20元 | |
| 【S32K3XX】SPD 软件包使用Link文件修改被打赏¥22元 | |
| Switch-Case局部变量定义问题被打赏¥23元 | |
| 基于米尔TIAM62L开发板的串口通信及应用被打赏¥20元 | |
| PCF8574功能模块及其使用被打赏¥20元 | |
| 传感器LSM6DSO及LIS3MDL的功能检测被打赏¥18元 | |
| LPS25HB气压传感器及其检测被打赏¥18元 | |
| HTS221温湿度传感器及其检测被打赏¥18元 | |
| 【S32K3XX】HSE FW 版本更新被打赏¥21元 | |
| 基于ArduinoUNO开发板的AT24C02读写测试被打赏¥16元 | |
我要赚赏金
