• Median


    这种方法感觉有点难懂

     1 #include "stdafx.h"
     2 #include <iostream>
     3 #include   <vector>
     4 using namespace std;
     5 
     6 class Solution{
     7 public:
     8     double findMedianSortedArrays(int A[],int m, int B[],int n){
     9     if(m>n) findMedianSortedArrays(B,n,A,m);
    10     int minidx=0,maxidx=m,i,j,num1,mid=(m+n+1)>>1,num2;
    11     while(minidx<=maxidx)
    12     {
    13         i=(minidx+maxidx)>>1;
    14         j=mid-i;
    15         if(i<m&&j>0&&B[j-1]>A[i])minidx=i+1;  //取前面部分,如果B[j-1]>A[i],说明A[i]个肯定不含中位数,且中位数只会在A[i-1]的后面,因为B[j-1]多了大于的数,但总中位数的排序却不变
    16         else if(i>0&&j<n&&A[i-1]>B[j])maxidx=i-1;   
    17         else {
    18         if(i==0)num1=B[j-1];
    19         else if (j==0)num1=A[i-1];    //i,j 不可能取满
    20         else num1=max(A[i-1],B[j-1]);  //可能A[i]=B[j-1]和A[i-1]=B[j]
    21         break;
    22         }
    23 
    24     }
    25     if((m+n)&1)return num1;
    26     if(i==m)num2=B[j];
    27     else if(j==n)num2=A[i];
    else num2 = min(A[i],B[j]); //偶数情况
    28 return (num1+num2)/2; 29 30 } 31 32 }; 33 34 int _tmain(int argc, _TCHAR* argv[]) 35 { 36 Solution a; 37 int m,n,x; 38 int A[50],B[50]; 39 cin>>m; 40 for(int i=0;i<m;i++){ 41 cin>>x; 42 A[i]=x; 43 } 44 cin>>n; 45 for(int i=0;i<m;i++){ 46 cin>>x; 47 B[i]=x; 48 } 49 50 51 cout<<a.findMedianSortedArrays(A,m,B,n); 52 53 54 system("pause"); 55 return 0; 56 57 58 }

    第二种方法及其巧妙,尤其对数组偶数与奇数的处理

     1 class Solution{
     2 public:
     3 double findMedianSortedArrays(int A[],int m,int B[],int n){
     4 int total =m+n;
     5 if(total &0x1)
     6 return find_kth(A,m,B,n,total/2+1);
     7 else 
     8    return (find_kth(A,m,B,n,total/2)+find_kth(A,m,B,n,total/2+1))/2.0;
     9 }
    10 private:
    11   static int find_kth(int A[],int m,int B[],int n,int k);
    12 {
    13 if(m>n)return find_kth(B,n,A,m,k);
    14 if(m==0)return B[k-1];
    15 if(k==1)return min(A[0],B[0]);
    16 int ia=min(k/2,m),ib=k-ia;
    17 if(A[ia-1]<B[ib-1])
    18   return find_kth(A+ia,m-ia,B,n,k-ia);
    19  else if(A[ia-1]>B[ib-1])
    20 return find_kth(A,m,B+ib,n-ib,k-ib);
    21  else 
    22   return A[ia-1];
    23 }
    24 }
  • 相关阅读:
    dubbo的超时机制
    今天又遇到之前的问题,后端返回数据long到前端失真
    如何在一台机子上配置两个github
    当sum函数返回null时处理
    Linux中zookeeper安装
    Linux常用指令
    sql执行顺序
    固定时间刷新某个固定值 java
    docker基础
    python之CSS
  • 原文地址:https://www.cnblogs.com/daocaorenblog/p/4790012.html
Copyright © 2020-2023  润新知