中位数

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

You may assume nums1 and nums2 cannot be both empty.

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
#include <iostream>
#include <vector>
#include <deque>
using namespace std;
class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        double result = 0;
        int m = int(nums1.size());
        int n = int(nums2.size());
        if(m<n)
        {
            swap(nums1,nums2);
            swap(m,n);
        }
        if(n==0)
            return m%2?nums1[m/2]:double(nums1[m/2-1]+nums1[m/2])/2;
        int imin = 0;
        int imax = m;
        int i = (imin + imax) / 2;
        int j = (m + n + 1) / 2 - i;
        while (true) {
            if ((i==0||j==n||nums2[j] >= nums1[i - 1])&&
                (i==m||j==0||nums2[j - 1] <= nums1[i])) {
                int maxLeft,minrignt;
                //3*3种情况
                //      i==0    i==m    i!=m
                //j==0    ×   3    5
                //j==n  1    ×    6
                //j!=n  2    4    7
                if(i==0) {
                    maxLeft = nums2[j - 1];
                    if (j == n)
                        minrignt = nums1[i];
                    else
                        minrignt = min(nums1[i], nums2[j]);
                    }
                else if(i==m)
                {
                    minrignt=nums2[j];
                    if(j==0)
                        maxLeft=nums1[i-1];
                    else
                        maxLeft=max(nums1[i-1],nums2[j-1]);
                }
                else
                    if(j==0) {
                        maxLeft = nums1[i - 1];
                        minrignt = min(nums1[i], nums2[j]);
                    }
                    else if(j==n) {
                        maxLeft=max(nums1[i-1],nums2[j-1]);
                        minrignt=nums1[i];
                     } else {
                        minrignt = min(nums1[i], nums2[j]);
                        maxLeft = max(nums1[i - 1], nums2[j - 1]);
                    }
                if((m+n)%2==0)
                    result=double(maxLeft+minrignt)/2;
                else
                    result=maxLeft;
                break;
                }
            if (nums2[j - 1] > nums1[i]) {
                i++;
                j--;
                continue;;
            }
            if (nums1[i - 1] > nums2[j]) {
                i--;
                j++;
                continue;
            }
        }
        return result;
    }
};
int main(){
   Solution A;
   vector<int> s1{4};
   vector<int> s2{1,2,3,5,6};
   double result=A.findMedianSortedArrays(s1,s2);
   cout<<"    "<<result<<endl;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值