4. Median of Two Sorted Arrays

来源:互联网 发布:云南特色饰品淘宝 编辑:程序博客网 时间:2024/06/04 19:26

题目

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
分析

找到两个有序数组的中位数,利用寻找两个有序数组中的第k个数和二分思想进行查找,每次比较可以抛弃一半长度的数组。

class Solution {public:    double find(vector<int>& nums1, vector<int>& nums2,int nums1_beg,int nums1_end,int nums2_beg,int nums2_end,int k){//寻找两个排序数组的第k个数        int nums1_mid=(nums1_beg+nums1_end)/2;//先计算得到各自的中间位置        int nums2_mid=(nums2_beg+nums2_end)/2;        if(nums1_beg>nums1_end)//如果nums1遍历完,返回k在nums2中的下标位置            return nums2[nums2_beg+k-1];        if(nums2_beg>nums2_end)//反之返回在nums1中的下标位置            return nums1[nums1_beg+k-1];        if(nums1[nums1_mid]<=nums2[bmid]){//如果nums1的中间元素小于nums2的中间元素,根据k与二者前半部分元素个数进行判断            if(k<=(nums1_mid-nums1_beg)+(nums2_mid-nums2_beg)+1){//k小于二者前半部分元素,则抛弃nums2的后半部分,继续找k的位置                return find(nums1,nums2,nums1_beg,nums1_end,nums2_beg,nums2_mid-1,k);            }            else{//如果大于二者前半部分的元素个数,则抛弃nums1的前半部分,并令k减去这部分的长度,继续找k的位置                return find(nums1,nums2,nums1_mid+1,nums1_end,nums2_beg,nums2_end,k-(nums1_mid-nums1_beg)-1);            }        }        else{            if(k<=(nums2_mid-nums2_beg)+(nums1_mid-nums1_beg)+1){                return find(nums1,nums2,nums1_beg,nums1_mid-1,nums2_beg,nums2_end,k);            }            else{                return find(nums1,nums2,nums1_beg,nums1_end,nums2_mid+1,nums2_end,k-(nums2_mid-nums2_beg)-1);            }        }    }    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {        int n=nums1.size(),m=nums2.size();        int k=(m+n+1)/2;//计算得出中位数是序列中的第k个数(从1开始算)        if((m+n)%2==0){//如果序列之和为偶数,则是第k个数和第k+1个数的平均数            double l=find(nums1,nums2,0,n-1,0,m-1,k);            double r=find(nums1,nums2,0,n-1,0,m-1,k+1);            return (l+r)/2;        }        return find(nums1,nums2,0,n-1,0,m-1,k);    }};

详细分析参考如下:

在两个有序的数组中找第N个数,二分查找 O(lgm+lgn)级

Share my O(log(min(m,n)) solution with explanation


原创粉丝点击