【Leetcode】【Median of Two Sorted Arrays】【两个排序数组的中位数】【C++】

  • 题目:给定两个排序数组,找出其中位数。
  • 说明:若两个数组的大小和为奇数,则返回中间的那个数,否则返回中间两个数的平均值。
  • 思路1:暴力求解法:先合并两个数组,然后根据下标索引返回相应的中位数
  • 思路2:分割法,分别将两个数组均等划分为2份(若数组大小为奇数,则两份大小差1)。最终的目标是使得两数组的左半部分数值均小于两数组的右半部分。
  • 代码1:
    class Solution {
    public:
        double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
            int len1=nums1.size();
            int len2=nums2.size();
            vector<int>comb_nums;
            int i1=0,i2=0;
            while(i1<len1 && i2<len2)
            {
                if(nums1[i1]<nums2[i2])
                {
                    comb_nums.push_back(nums1[i1]);
                    i1++;
                }
                else
                {
                    comb_nums.push_back(nums2[i2]);
                    i2++;
                }
            }
            while(i1<len1)
            {
                comb_nums.push_back(nums1[i1]);
                i1++;
            }
            while(i2<len2)
            {
                comb_nums.push_back(nums2[i2]);
                i2++;
            }
            if((len1+len2) & 1)
            {
                return comb_nums[(i1+i2)/2];
            }
            return (comb_nums[(i1+i2)/2]+comb_nums[(i1+i2)/2-1])/2.0;
            
        }
    };

     

  • 代码2:注意当两个数组均为奇数使相同的划分结果会使的总的左右两部分差2,应对其中一个划分稍作调整
                index_1++;
            
            
            int L1=index_1<0?INT_MIN:nums1[index_1],R1=index_1==(len_nums1-1)?INT_MAX:nums1[index_1+1];
            int L2=index_2<0?INT_MIN:nums2[index_2],R2=index_2==(len_nums2-1)?INT_MAX:nums2[index_2+1];
            
            while(L1>R2 || L2>R1)
            {
                if(L1>R2)
                {
                    R1=L1;
                    L2=R2;
                    if(index_1==0)
                        L1=INT_MIN;
                    else{
                        index_1--;
                        L1=nums1[index_1];
                    }
                    if((index_2+2)==(len_nums2))
                        R2=INT_MAX;
                    else{
                        index_2++;
                        R2=nums2[index_2+1];
                    }
                }
                else
                {
                    L1=R1;
                    R2=L2;
                    if(index_2==0)
                        L2=INT_MIN;
                    else{
                        index_2--;
                        L2=nums2[index_2];
                    }
                    
                    if((index_1+2)==(len_nums1))
                        R1=INT_MAX;
                    else{
                        index_1++;
                        R1=nums1[index_1+1];
                    }
                }
                
            }
            if((len_nums1+len_nums2)%2==0)
                return (max(L1,L2)+ min(R1,R2))/2.0;
            else
                return min(R1,R2);
            
        }
    };

     

posted @ 2018-06-09 14:49  dreamer123  阅读(366)  评论(0编辑  收藏  举报