题目描述
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
示例
- 示例1
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
- 示例2
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
提示
- nums1.length == m
- nums2.length == n
- 0 <= m <= 1000
- 0 <= n <= 1000
- 1 <= m + n <= 2000
- -106 <= nums1[i], nums2[i] <= 106
解题思路
- 因为两个数组都是有序的,所以可以用类似于归并排序那样,分别从两个数组中往外取元素;
- 中位数即是数组最中间的那个数,就可以根据两个原数组的长度计算出来;
- 从两个原数组中往外取元素,直到取到对应下标的元素,退出循环,计算并返回结果。
代码
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int len_1, len_2;
int cur, begin, end, idx_1, idx_2, key;
float temp = 0;
len_1 = nums1.size();
len_2 = nums2.size();
if((len_1+len_2) % 2 == 0){
end = (len_1+len_2) / 2;
begin = end - 1;
}else{
begin = (len_1+len_2) /2;
end = begin;
}
cur = -1;
idx_1 = 0;
idx_2 = 0;
while(idx_1 < len_1 && idx_2 < len_2){
if(nums1[idx_1] < nums2[idx_2]){
key = nums1[idx_1];
idx_1++;
}else{
key = nums2[idx_2];
idx_2++;
}
cur++;
if(cur > end){
break;
}
if(cur >= begin){
temp += key;
}
}
while(idx_1 < len_1){
key = nums1[idx_1];
idx_1++;
cur++;
if(cur > end){
break;
}
if(cur >= begin){
temp += key;
}
}
while(idx_2 < len_2){
key = nums2[idx_2];
idx_2++;
cur++;
if(cur > end){
break;
}
if(cur >= begin){
temp += key;
}
}
if(begin == end){
return temp;
}else{
return temp / 2;
}
}
};
提交结果
总结
- 碰到多个数组且有序,想归并的思想。