第二周作业:
4. Median of Two Sorted Arrays
解题思路:
4. Median of Two Sorted Arrays
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)).
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思路:这道题的标签是分治算法,因此一开始的思路就是向着这个方向的。既然是分治,则必须先想想怎么“分”。既然这道题目的输入是两个数组,那么首先想到的就是将两个数组分别取中间的值并进行比较。那么这个比较的意义是什么呢?我们假设两个输入数组分别是A和B并假设A的元素个数不多于B。如果A的中间值小于B的中间值,那么我们就可以扔掉A的前半部分,只保留A的后半部分即可。因为对于B来说,B的前一半都是比B小的,若A和B结合起来存在一个位置在中间的数,那么这个数不可能是在比B的中间值还要小的位置,因此A的总元素个数比B要少。这样,每一次分,都将数组减半,大大降低了复杂度。
具体实现方法考虑使用递归,每次将元素个数较少的数组进行拆分。
代码如下:
double rec_find(vector<int>& nums1, vector<int>& nums2,int num){
int a=nums1.size(),b=nums2.size();
vector<int> temp1(nums1);
vector<int> temp2(nums2);
if(a>b)
return rec_find(temp2,temp1,num);
if(!a){
return temp2[num-1];}
if(num==1)
return min(temp1[0],temp2[0]);
int numa = min(num/2,a), numb = num - numa;
if (temp1[numa - 1] < temp2[numb - 1]) {
temp1.erase(temp1.begin(),temp1.begin()+numa);
return rec_find(temp1, temp2,num - numa);
}
else if (temp1[numa - 1] > temp2[numb - 1]) {
temp2.erase(temp2.begin(),temp2.begin()+numb);
return rec_find(temp1,temp2, num - numb);
}
else
return temp1[numa - 1];
}
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int a=nums1.size(),b=nums2.size();
if((a+b)%2)
return rec_find(nums1,nums2,(a+b)/2+1);
else
return (rec_find(nums1,nums2,(a+b)/2)+rec_find(nums1,nums2,(a+b)/2+1))/2;
}
};