There are two sorted arrays nums1 and nums2 of size m and n respectively.
Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
You may assume nums1 and nums2 cannot be both empty.
Example 1:
nums1 = [1, 3]
nums2 = [2]
The median is 2.0
Example 2:
nums1 = [1, 2]
nums2 = [3, 4]
The median is (2 + 3)/2 = 2.5
分析:
方法一:把两个数组合并之后排序,再输出中位数。
方法二:画一条线把两个数组都分成两部分(一共分成了四部分),只要保证左边的两个部分所有数的最大值小于等于右边两个部分所有数的最小值,且左边两个部分的总数等于右边两个部分的总数,那么中位数就等于左边最大的数加右边最小的数除以2。
C++:
class Solution {
public:
double findMedianSortedArrays(vector<int> &nums1, vector<int> &nums2) {
vector<int> nums3;
nums3.insert(nums3.end(), nums1.begin(), nums1.end());
nums3.insert(nums3.end(), nums2.begin(), nums2.end());
sort(nums3.begin(), nums3.end());
int len = nums3.size();
double res;
if (len % 2 == 0) {
double a = (double) nums3[len / 2 - 1];
double b = (double) nums3[len / 2];
res = (a + b) / 2;
} else {
res = (double) nums3[len / 2];
}
return res;
}
};
Java:
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
List<Integer> list1 = Arrays.stream(nums1).boxed().collect(Collectors.toList());
List<Integer> list2 = Arrays.stream(nums2).boxed().collect(Collectors.toList());
list1.addAll(list2);
Collections.sort(list1);
int len = list1.size();
double res;
if (len % 2 == 0) {
double a = (double) list1.get(len / 2 - 1);
double b = (double) list1.get(len / 2);
res = (a + b) / 2;
} else {
res = (double) list1.get(len / 2);
}
return res;
}
}