一、题目描述
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
二、示例
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
三、分析
思路:获取元素总数,算出中位数所在位置,利用双指针从小到大遍历两个数组,得到中位数;
1. 如果共有奇数个,中位数在第sum/2+1个
2. 如果共有偶数个,中位数是sum/2和sum/2+1的平均数
时间复杂度:遍历到中位数 O(m+n)
空间复杂度:无额外空间 O(1)
四、代码
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
//用于遍历两个数组
int p1=0,p2=0;
//记录总数的奇偶
int count=(nums1.size()+nums2.size())%2;
//记录中位数的位置
int loc=(nums1.size()+nums2.size())/2+1;
//存储中位数
int cen;
//存储中位数的前一个数字(如果总数为偶数,会用到)
int cenlast;
//遍历,当遍历到中位数时跳出循环
while(loc--){
//中位数的前一个数即为上一次循环中遍历得到的cen
cenlast=cen;
//遍历两个数组,其中数值较小的数组指针向后移动,保证按从小到大遍历
if(p2>=nums2.size()||(p1<nums1.size()&&nums1[p1]<=nums2[p2])){
cen=nums1[p1];
p1++;
}else{
cen=nums2[p2];
p2++;
}
}
//如果是奇数,直接返回cen
if(count)return cen;
//如果是偶数,返回cen和cenlast的平均值
else return ((double)cenlast+cen)/2;
}
};