给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。你可以假设 nums1 和 nums2 不同时为空。
解法粗暴丑陋,等写完论文有时间再思考优化方法改进一下。
python:
class Solution(object):
def findMedianSortedArrays(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: float
"""
l1 = len(nums1)
l2 = len(nums2)
if l1 == 0:
if l2%2 == 1:
midIndex = ((l2-1)/2)
midNum = nums2[midIndex]
else:
left = (l2 / 2)
right = left - 1
midNum = (float(nums2[left]+nums2[right])/2)
elif l2 == 0:
if l1%2 == 1:
midIndex = ((l1-1)/2)
midNum = nums1[midIndex]
else:
right = (l1 / 2)
left = right - 1
midNum = (float(nums1[left]+nums1[right])/2)
elif l1 == 1 and l2 == 1:
midNum = (float(nums1[0]+nums2[0])/2)
else:
nums = nums1 + nums2
nums = sorted(nums)
l = l1 + l2
if l%2 == 1:
midIndex = ((l-1)/2)
midNum = nums[midIndex]
else:
right = (l / 2)
left = right - 1
midNum = (float(nums[left]+nums[right])/2)
return midNum
C++(效率比较低):
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int l1 = nums1.size();
int l2 = nums2.size();
double midNum = 0.0;
if(l1 == 0 || l2 == 0){
if(l1 == 0){
vector<int> nums(nums2);
int l = l2;
if(l % 2 != 0){
int midIndex = ((l-1)/2);
midNum = static_cast<double>(nums[midIndex]);
}
else{
int right = (l/2);
int left = right - 1;
midNum = static_cast<double>(nums[left] + nums[right]);
midNum /= 2;
}
}
else{
vector<int> nums(nums1);
int l = l1;
if(l % 2 != 0){
int midIndex = ((l-1)/2);
midNum = static_cast<double>(nums[midIndex]);
}
else{
int right = (l/2);
int left = right - 1;
midNum = static_cast<double>(nums[left] + nums[right]);
midNum /= 2;
}
}
}
else{
for(int i = 0;i<l2;i++){
nums1.push_back(nums2[i]);
}
sort(nums1.begin(),nums1.end());
vector<int> nums(nums1);
int l = l1 + l2;
if(l % 2 != 0){
int midIndex = ((l-1)/2);
midNum = static_cast<double>(nums[midIndex]);
}
else{
int right = (l/2);
int left = right - 1;
midNum = static_cast<double>(nums[left] + nums[right]);
midNum /= 2;
}
}
return midNum;
}
};