zoukankan      html  css  js  c++  java
  • 两个正序数组的中位数

    两个正序数组的中位数

    给定两个大小为 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; 
    }
    
  • 相关阅读:
    java web项目打包.war格式
    version 1.4.2-04 of the jvm is not suitable for thi
    Sugarcrm Email Integration
    sharepoint 2010 masterpage中必须的Content PlaceHolder
    微信开放平台
    Plan for caching and performance in SharePoint Server 2013
    使用自定义任务审批字段创建 SharePoint 顺序工作流
    Technical diagrams for SharePoint 2013
    To get TaskID's Integer ID value from the GUID in SharePoint workflow
    how to get sharepoint lookup value
  • 原文地址:https://www.cnblogs.com/flightless/p/13708074.html
Copyright © 2011-2022 走看看