LeetCode #4

来源:互联网 发布:淘宝上好看的包包店 编辑:程序博客网 时间:2024/05/22 00:35

题目描述:

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


此题为hard难度,需要满足时间复杂度为O(log(m+n)),所以应该采用二分法。由于两个数组是有序的,可以令k=(m+n)/2,比较两个数组的前k/2个元素,如果nums1[k/2-1]>nums2[k/2-1],可以确定在nums1的0到(k/2-1)共k/2个元素中,必定不存在两个数组的中位数,可以直接除去这k/2个元素,反之同理。然后进行递归,求剩下两个数组的第k/2个元素,相当于是对k进行了二分,所以时间复杂度为O(log(m+n)),当k=1时即可直接求解。同时还要注意一些例外的情况,比如当一个数组元素为空时,就直接求另外一个数组的第k个元素即可,还有就是如果一个数组元素个数小于k/2时,直接取这个数组最后一个元素和另一个数组进行比较。这种方法不止对求两个有序数组的中位数有效,求任意第k个值都可以。

class Solution {public:    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {        int m=nums1.size();        int n=nums2.size();        if((m+n)%2==1)            return findKth(nums1,nums2,(m+n)/2+1);        else return (findKth(nums1,nums2,(m+n)/2)+findKth(nums1,nums2,(m+n)/2+1))/2;    }        double findKth(vector<int> nums1, vector<int> nums2, int k)    {        int m=nums1.size();        int n=nums2.size();        if(m==0)            return nums2[k-1];        else if(n==0)            return nums1[k-1];        if(k==1)            return min(nums1[0],nums2[0]);                  int i=min(m,k/2);        int j=min(n,k/2);                if(nums1[i-1]>nums2[j-1])        {            vector<int> nums(nums2.begin()+j,nums2.end());            return findKth(nums1,nums,k-j);        }        else if(nums1[i-1]<=nums2[j-1])        {            vector<int> nums(nums1.begin()+i,nums1.end());            return findKth(nums2,nums,k-i);        }    }};


原创粉丝点击