zoukankan      html  css  js  c++  java
  • 3-4-多数组中位数

    题目描述:

      给定两个有序数组arr1和arr2,两个数组长度都为N,求两个数组中所有数的上中位数。
      例如:
        arr1 = {1,2,3,4};
        arr2 = {3,4,5,6};
      一共8个数则上中位数是第4个数,所以返回3。

        arr1 = {0,1,2};
        arr2 = {3,4,5};
      一共6个数则上中位数是第3个数,所以返回2。

    要求:时间复杂度O(logN)

     1 /*
     2     思路: 二分思路
     3         首先分别找出两个数组arr1和arr2的中位数,分别为mid1,mid2,比较,
     4         1) 如果mid1 == mid2,则该数即为所有数的上中位数。
     5         2) mid1 > mid2时:
     6         若数组长度N为偶数时:
     7           因为mid1>mid2,所以mid2不可能是所有数的上中位数,arr1中mid1后面的数也不可能是上中位数,
     8           此时两个数组就分别筛选掉了一半,然后递归对arr1的前半部分和arr2的后半部分求所有数的上中位数。
     9         若数组长度N为奇数时:
    10           因为mid1>mid2,所以mid1不可能是所有数的上中位数,但mid2有可能是,由于球上中位数的两个数组
    11           必须等长,因此,我们递归对arr1的前半部分(包括mid1)和arr2的后半部分(包括mid2)求所有数的上中位数。
    12         3) mid1 < mid2时的情况和 2)类似。
    13 */
    14 #include <iostream>
    15 #include <vector>
    16 using namespace std;
    17 
    18 int findProcess(vector<int> arr1, int l1, int r1, vector<int> arr2, int l2, int r2){
    19     if (l1 == r1)
    20         return (arr1[l1] < arr2[l2] ? arr1[l1] : arr2[l2]);
    21     // 元素个数为奇数,则offset=0;否则offset=1.
    22     int offset = ((r1-l1+1)&1) ^ 1;
    23     int mid1 = (l1+r1)/2;
    24     int mid2 = (l2+r2)/2;
    25     if (arr1[mid1] > arr2[mid2])
    26         return findProcess(arr1, l1, mid1, arr2, mid2+offset, r2);
    27     else if(arr1[mid1] < arr2[mid2])
    28         return findProcess(arr1, mid1+offset, r1, arr2, l2, mid2);
    29     else
    30         return arr1[mid1];
    31 }
    32 
    33 int getUpMedian(vector<int> arr1, vector<int> arr2){
    34     if (arr1.size() == 0 || arr2.size() == 0 || arr1.size() != arr2.size())
    35         return -1;
    36     return findProcess(arr1, 0, arr1.size()-1, arr2, 0, arr2.size()-1);
    37 }
    38 
    39 int main(){
    40     vector<int> a1;
    41     a1.push_back(1);
    42     a1.push_back(2);
    43     a1.push_back(3);
    44     a1.push_back(4);
    45 
    46     vector<int> a2;
    47     a2.push_back(3);
    48     a2.push_back(4);
    49     a2.push_back(5);
    50     a2.push_back(6);
    51     cout << getUpMedian(a1,a2) << endl;
    52     return 0;
    53 }
  • 相关阅读:
    套接字socket
    Windows环境下教你用Eclipse ADT 插件生成.h/.so文件,Java下调用JNI,轻松学习JNI
    How to start/stop DB instance of Oracle under Linux
    Oracle SGA具体解释
    Oracle Study之--Oracle 单实例11.2.0.1.0升级到11.2.0.3.0
    MapReduce(十六): 写数据到HDFS的源代码分析
    Spring表达式语言SpEL简单介绍
    LinkCutTree详解
    洛谷P3379 【模板】最近公共祖先(LCA)(树链剖分)
    树链剖分详解
  • 原文地址:https://www.cnblogs.com/qianmacao/p/4884795.html
Copyright © 2011-2022 走看看