力扣算法篇:寻找两个正序数组的中位数
寻找两个正序数组的中位数:给定两个大小分别为m和n的正序(从小到大)数组nums1和nums2。请你找出并返回这两个正序数组的中位数。
实例:
题解:遍历两个数组 得到有序的合并数组并找到中位数
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
//寻找两个正序数组的中位数
//首先得到两个数组的长度
int m = nums1.size();
int n = nums2.size();
//如果有两个数组均为空
if(m == 0 && n == 0){
return 0;
}
vector<int> combine;
int i = 0;
int j = 0;
while(m>0 && n>0){
//合并两个数组
int x = nums1[i];
int y = nums2[j];
if(x>y){
//前者比后者大 插入后者 继续比较
combine.push_back(y);
j++;
}else if(x == y){
//两者相等
combine.push_back(x);
combine.push_back(y);
i++;
j++;
}else{
//后者比前者大 插入前者 继续比较
combine.push_back(x);
i++;
}
//查看i和j是否超出范围
if(i >= m && j < n){
//数组1遍历完毕 将数组2剩余元素加入合并数组
for(int x = j;x < n;x++){
combine.push_back(nums2[x]);
}
//合并完结束
break;
}
if(j >= n && i < m){
//数组2遍历完毕 将数组1剩余元素加入合并数组
for(int x = i;x < m;x++){
combine.push_back(nums1[x]);
}
//合并完结束
break;
}
//两个数组都遍历完毕
if(j>=n && i>=m){
break;
}
}
//如果有一个数组为空
if(m == 0){
combine = nums2;
}else if(n == 0){
combine = nums1;
}
//得到合并数组的长度
int len = m+n;
double median = 0.0;
//奇数个
if(len%2 == 1){
median = combine[(len-1)/2];
}else{
//偶数个
median = (combine[len/2]+combine[len/2-1])/2.0;
}
return median;
}
};