LeetCode 4:Median of Two Sorted Arrays

博客转载请注明地址:

题目描述

题目地址:https://leetcode.com/problems/median-of-two-sorted-arrays/
给出两个有序数组,求两个有序数组合并在一起的中位数是多少?

考察点

  1. 二分查找,分治
  2. 分类讨论

思路

传统的二分查找在 [LR] 区间求出满足条件的值。该题是一个举一反三,希望在区间 ([L1,R1],[L2,R2]) 查找出满足条件的值。

转换问题
1. 将题目求中位数转换成:在合并的数组中,找到第k小的数。
假设合并后的数组大小为n,arr表示合并后的数组
那么:
sum=(arr[(n+1)/2]+arr[(n+2)/2])/2.0
枚举一下,就知道这个式子的正确性。

  1. 在合并后的数组中,中arr_1

不断缩小寻找区间
假设当前的寻找区间为 ([L1,R1],[L2,R2])
mid1=L1+R1/2 ;
mid2=L2+R2/2 ;

maxNum=max(arr1[mid1],arr2[mid2])

如果将这mid_1+mid_2个数字组合在一起

Code

class Solution {
public:
 double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int L[2], R[2], len[2];
        int *arr[2];
        int mid[2];
        int mid_len[2];
        int min_p, max_p;
        int dlt_len;
        double sum;

        len[0] = nums1.size();
        len[1] = nums2.size();

        arr[0] = new int[len[0] + 2];
        arr[1] = new int[len[1] + 2];

        for(int i = 1; i <= len[0]; i++)
            arr[0][i] = nums1[i-1];

        for(int i = 1; i <= len[1]; i++)
            arr[1][i] = nums2[i-1];

        mid_len[0] = (len[0] + len[1] + 1) >> 1;
        mid_len[1] = (len[0] + len[1] + 2) >> 1;

        if(!len[0] || !len[1]){
            if(!(len[0]^len[1]))
                return 0.0;
            else
                return (arr[!len[0]][mid_len[0]] + arr[!len[0]][mid_len[1]] ) / 2.0;
        }


        L[0] = 0;  R[0] = len[0];
        L[1] = 0;  R[1] = len[1];

        arr[0][0] = arr[1][0] = min(arr[0][1], arr[1][1]);
        arr[0][len[0]+1] = arr[1][len[1]+1] = max(arr[0][len[0]], arr[1][len[1]]);

        while(true){
            mid[0] = (L[0] + R[0]) >> 1;
            mid[1] = (L[1] + R[1]) >> 1;

            max_p =  arr[1][mid[1]] >= arr[0][mid[0]];
            min_p = !max_p;

            dlt_len = mid[0] + mid[1] - mid_len[0];

            if(dlt_len == 0){

                if(arr[min_p][mid[min_p]+1] >= arr[max_p][mid[max_p]]){
                    break;
                }else{
                    R[max_p] = mid[max_p] - 1;
                    L[min_p] = mid[min_p] + 1;
                }
            }else if(dlt_len > 0){

                R[max_p] = mid[max_p] - 1;

            }else{ // < 0

                L[min_p] = mid[min_p];

                min_p = !(arr[0][L[0] + 1] <= arr[1][L[1]+1]);

                L[min_p]++;
            }
        }


        sum = arr[max_p][mid[max_p]];

        if(mid_len[0] != mid_len[1]){
            sum += min(arr[0][mid[0]+1], arr[1][mid[1]+1]);
            sum /= 2;
        }


        return sum;

    }
};

排名

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值