• 两个正序数组的中位数


    两个正序数组的中位数

    给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。

    请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

    你可以假设 nums1 和 nums2 不会同时为空。

    解法一 双指针

    对于奇数个数,中位数一定为第(n+m)/2+1个
    对于偶数个数,中位数一定在第(n+m)/2和(n+m)/2+1个
    那么为了统一情况,应对奇数和偶数的情况,我们需要记录两个值,当前值和上一个值
    代码如下:

    int l=0,r=0;
    int left=-1,right=-1,len=(n+m);
    for(int i=0;i<=len/2;i++)
    {
       left=right;
       if(l<n&&(r>=m||nums1[l]<nums2[r])
           right=nums1[l++];
       else
           right=nums2[r++];
    }
    if(len&1)  return right;
    else return (left+right)*0.5;
    

    解法二--- 二分,找区间第k小数

    思路是我们分别寻找两个有序数组的第k/2个数,假设nums1[k/2]<nums2[k/2],那么可以推知nums1左半部分的数字都可以舍去,于是我们对新的区间重复上述动作,从而可以递归实现

     //获得两个数组的第k大的数
        int getk(vector<int>& nums1,int st1,int ed1,vector<int>& nums2,int st2,int ed2,int k)
        {
            int len1=ed1-st1+1;
            int len2=ed2-st2+1;
            if(len1>len2) return getk(nums2,st2,ed2,nums1,st1,ed1,k); //始终保持len1<len2
            if(len1==0)  return nums2[st2+k-1];  //一定是len1先为0
            if(k==1)  return min(nums1[st1],nums2[st2]);
            //寻找每个数组中第k/2个元素
            int i=st1+min(k/2,len1)-1;
            int j=st2+min(k/2,len2)-1;
    
            if(nums1[i]>nums2[j])  //此时nums2的st2左半部分可以删除
                return getk(nums1,st1,ed1,nums2,j+1,ed2,k-(j-st2+1));
            else
                return getk(nums1,i+1,ed1,nums2,st2,ed2,k-(i-st1+1));
        }
        double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
            int n=nums1.size(),m=nums2.size();
            int left=(n+m+1)/2;
            int right=(n+m+2)/2;
            return  (getk(nums1,0,n-1,nums2,0,m-1,left)+getk(nums1,0,n-1,nums2,0,m-1,right))*0.5; 
    }
    
  • 相关阅读:
    移动端按钮居底
    easyui用KindEditor编辑器
    查找数组中与后面项匹配的和猴子选大王
    before和after的样式符号
    jq的select
    验证最多2位小数,1到10 不超过10 带两位小数的正则表达式
    在谷歌浏览器下vue的@input事件问题
    mvc项目+vue+vant【进行中】
    微商代理查询系统 开发完成,免费体验试用哦!
    淘宝出了个麻吉宝区块连产品,附带麻吉宝邀请码!
  • 原文地址:https://www.cnblogs.com/flightless/p/13708074.html
Copyright © 2020-2023  润新知