Leetcode #4 Median of Two Sorted Arrays

来源:互联网 发布:gom引擎npc算法 编辑:程序博客网 时间:2024/05/19 21:40

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)).

Difficulty:Hard

看似比较简单的一题,复杂度要求O(log (m+n)),貌似我只用了O(m+n)。写下思路。

1.首先,用四个int记录两个数组分别头尾的下标,为start1,end1,start2,end2.

2.每次循环,分别剔除这四个下标对应数的最小值与最大值,以此来不断缩减数组。

   这里有个很关键的地方,万一所有值都一样大小,千万不能只剔除一个。

while(1){            if(end1<start1)               return findM(start2,end2,nums2);            if(end2<start2)               return findM(start1,end1,nums1);            if(end2-start2-start1+end1+2==flag)               return findMtwo(start1,end1,nums1,start2,end2,nums2);            if(nums1[end1]>=nums2[end2]) //这里特别注意               end1--;            else               end2--;            if(nums1[start1]>=nums2[start2]) //这里特别注意               start2++;            else               start1++;        }
3. 直到缩减到,一个数组消失或者两个数组都只剩一个一个数,这时候扔到前面写的方法处,返回所需要的值。


这个作法的复杂度无疑是非常非常可靠的。

class Solution {public:    double findM(int start,int end,vector<int>& nums){        double ans;        if(start==end){           ans = nums[start];           return ans;        }        if((end-start)%2==1){            ans = (nums[(start+end)/2]+nums[(start+end)/2+1])/2;            if((nums[(start+end)/2]+nums[(start+end)/2+1])%2==1)                ans = ans + 0.5;            return ans;        }        else{            ans = nums[(start+end)/2];            return ans;        }    }    double findMtwo(int start1,int end1,vector<int>& nums1,int start2,int end2,vector<int>& nums2){        vector<int> ans;        for(int i = start1;i<=end1;i++)           ans.push_back(nums1[i]);        for(int i = start2;i<=end2;i++)           ans.push_back(nums2[i]);           return findM(0,ans.size()-1,ans);    }    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {        int len1 = nums1.size();        int len2 = nums2.size();        int mid1,mid2,temp1,temp2;        if(len1==0)            return findM(0,len2-1,nums2);        if(len2==0)            return findM(0,len1-1,nums1);        int start1 = 0, start2 = 0;        int end1 = len1-1,end2=len2-1;        int flag;        if((len1+len2)%2==1)           flag=1;        else           flag=2;        int index1,index2;        while(1){            if(end1<start1)               return findM(start2,end2,nums2);            if(end2<start2)               return findM(start1,end1,nums1);            if(end2-start2-start1+end1+2==flag)               return findMtwo(start1,end1,nums1,start2,end2,nums2);            if(nums1[end1]>=nums2[end2])               end1--;            else               end2--;            if(nums1[start1]>=nums2[start2])               start2++;            else               start1++;        }    }};



0 0