算法设计作业2

第二周作业:

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;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值