题目:给定两个排好序的数组,如何在O(N+M)的时间复杂度下找到它们的中位数?假设其中一个数组的长度为N,另一个数组的长度为M.
中位数的定义是这样的,如果有N个数从大到小排序,若N为奇数,则中位数为中间那1个数,若N为偶数,则中位数为中间那两个数的平均数。
code如下,按照类似归并排序中得归并的过程来写,写得相当啰嗦。
如果能够另外开辟一个空间来存放归并排序后的新数组,代码应该会简洁一些,不过这样倒是空间和时间都会多用一些了。
//
// Solution.h
// LeetCodeOJ_002_MedianOf2Array
#ifndef LeetCodeOJ_002_MedianOf2Array_Solution_h
#define LeetCodeOJ_002_MedianOf2Array_Solution_h
class Solution {
public:
double findMedianSortedArrays(int A[], int m, int B[], int n) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
int p_a=0;
int p_b=0;
double median_number=0.0;
double median_number_l=0.0;
double median_number_r=0.0;
if((m+n)%2!=0) {//两个数组的元素数目之和为奇数
int limit=(m+n)/2+1; //下标为(m+n)/2,个数为(m+n)/2+1
int count=0;
while((p_a<m)&&(p_b<n)&&(count!=limit)){
if(A[p_a]<=B[p_b]){
median_number=A[p_a];
p_a++;
}
else{
median_number=B[p_b];
p_b++;
}
count++;
}
// std::cout<<"1-1 limit:"<<limit<<",count:"<<count<<",median_number:"<<median_number<<std::endl;
if(p_a==m) {
while((p_b<n)&&(count!=limit)) {
median_number=B[p_b];
p_b++;
count++;
}
}
// std::cout<<"1-2 limit:"<<limit<<",count:"<<count<<",median_number:"<<median_number<<std::endl;
if(p_b==n) {
while((p_a<m)&&(count!=limit)) {
median_number=A[p_a];
p_a++;
count++;
}
}
// std::cout<<"1-3 limit:"<<limit<<",count:"<<count<<",median_number:"<<median_number<<std::endl;
return (double)median_number;
} else {//两个数组的元素数目之和为偶数
int limit=(m+n)/2; //media为中间第一个数和中间第二个数的平均数。中间第一个数的下标为(m+n)/2-1,个数为(m+n)/2
int count=0;
while((p_a<m)&&(p_b<n)&&(count!=limit)){
if(A[p_a]<=B[p_b]){
median_number_l = A[p_a];
p_a++;
}
else{
median_number_l = B[p_b];
p_b++;
}
count++;
}
//std::cout<<"2-1 limit:"<<limit<<",count:"<<count<<",median_number:"<<median_number<<std::endl;
// std::cout<<"2-1 median_number_l:"<<median_number_l<<", median_number_r:"<<median_number_r<<std::endl;
if(p_a==m) {
while((p_b<n)&&(count!=limit)) {
median_number_l = B[p_b];
p_b++;
count++;
}
}
//std::cout<<"2-2 limit:"<<limit<<",count:"<<count<<",median_number:"<<median_number<<std::endl;
//std::cout<<"2-2 median_number_l:"<<median_number_l<<", median_number_r:"<<median_number_r<<std::endl;
if(p_b==n) {
while((p_a<m)&&(count!=limit)) {
median_number_l = A[p_a];
p_a++;
count++;
}
}
//std::cout<<"2-3 limit:"<<limit<<",count:"<<count<<",median_number:"<<median_number<<std::endl;
//std::cout<<"2-3 median_number_l:"<<median_number_l<<", median_number_r:"<<median_number_r<<std::endl;
if((p_a<m)&&(p_b<n)) {
if(A[p_a]<=B[p_b])
median_number_r = A[p_a];
else
median_number_r = B[p_b];
} else if(p_a<m){
median_number_r = A[p_a];
} else {
median_number_r = B[p_b];
}
//std::cout<<"2-4 limit:"<<limit<<",count:"<<count<<",median_number:"<<median_number<<std::endl;
//std::cout<<"2-4 median_number_l:"<<median_number_l<<", median_number_r:"<<median_number_r<<std::endl;
return (double)(median_number_l+median_number_r)/2;
}
}
};
#endif