题目描述:

  给定两个有序数组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 }

转载于:https://www.cnblogs.com/qianmacao/p/4884795.html

3-4-多数组中位数相关推荐

  1. 寻找大数组中位数问题(一)

    前言 之前在面试的时候,面试官非常喜欢问:你好,请问在一个很大的数组中怎样快速地找出它的中位数? 当时很迷惑,为什么面试官总喜欢找中位数?后来了解到快速排序算法的思想后,发现如果大概知道待排序数组中位 ...

  2. LeetCode上求两个排序数组中位数问题—— Median of Two Sorted Arrays

    1.题目 There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of th ...

  3. ACM学习历程—51NOD 1685 第K大区间2(二分 树状数组 中位数)

    http://www.51nod.com/contest/problem.html#!problemId=1685 这是这次BSG白山极客挑战赛的E题. 这题可以二分答案t. 关键在于,对于一个t,如 ...

  4. java 数组中位数_找到数组总和的中位数

    正确的O(n)解决方案非常复杂,需要大量的文本,代码和技巧来解释和证明 . 更确切地说,令人信服地需要3页,这里可以详细查看http://www.cse.yorku.ca/~andy/pubs/X+Y ...

  5. 时间排序_你懂使用C ++ STL在线性时间内查找未排序数组的中位数吗

    也许你现在还在愁着学习C++?您不知道该怎么使用C++ST在线性时间内查找未排序数组的中位数,那么本文就用几组代码教您查找. 给定具有N个元素的未排序数组 arr [],任务是找出线性时间复杂度的数组 ...

  6. 【LeetCode】寻找两个有序数组的中位数【性质分析+二分】

    给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 ...

  7. 图解数组计算模块NumPy下(三角函数、四舍五入函数(around)、取整、将弧度转化为角度、统计分析函数、中位数、数组的排序、argsort()、lexsort())

    本文来自<Python数据分析从入门到精通>--明日科技编著 8.5 NumPy常用统计分析函数 8.5.1 数学运算函数 NumPy包含大量的数学运算的函数,包括三角函数.算术运算函数. ...

  8. LeetCode4寻找两个有序数组的中位数(二分查找+分治)

    目录 1.题目 2.分析 3.代码 二分查找:绝大多数二分查找问题利用的是单调性,也有一些例外)或者题目本身蕴含的可以逐渐缩小问题规模的特性解决问题.时间复杂度log级. 分治法的设计思想是:将一个难 ...

  9. 找两个有序数组中的中位数---分治法实验1

    问题描述 设X[ 0 : n - 1]和Y[ 0 : n – 1 ]为两个数组,每个数组中含有n个已排好序的数.找出X和Y的2n个数的中位数. 编程任务 利用分治策略试设计一个O (log n)时间的 ...

最新文章

  1. 汇编语言的准备知识--给初次接触汇编者 之三
  2. JavaScript 第三课 DOM
  3. ESP定律手工脱壳步骤
  4. 1600802047 android 第三次作业(音乐播放器)
  5. 各种经典java小游戏_Java是这个世界上最好的语言!
  6. Access优已成忧,一年后,还是离开了秋色园了
  7. Effective C++ 条款 50:了解new和delete的合理替换时机
  8. atitit.网络文件访问协议.unc smb nfs ftp http的区别
  9. 优雅使用百度云进行表格OCR识别(python版)
  10. java邮件撤回_JavaMail 退回邮件
  11. vue,el-image 图片引入根路径@无效
  12. rn 地图根据区名获取经纬度_React Native获取地理位置(获取具体城市、经纬度)...
  13. 黑苹果制作Clover开机引导脱离U盘,小新Pro13详细教程
  14. 部署Apache Doris
  15. 五一劳动节,向劳动者致敬!
  16. C\C++中strcat()函数
  17. 互联网的组成_网络层
  18. 怎样才能让百度搜索到自己的csdn博客?
  19. 七巧板涂色算法(Python)
  20. 波形分辨率与FFT分辨率的区别

热门文章

  1. Spring中定时任务Quartz集群配置学习
  2. Perl的Net::SSH::Perl模块实现远程登陆ssh
  3. UnityWebform(2):自定义LifetimeManager和TypeConverter使Unity从HttpContext中取值注入WebForm页面...
  4. B端+C端“两条腿走路”,左手医生欲建立医疗信息服务平台
  5. Nginx负载调度器+双Tomcat负载及会话共享+MySQL后端数据库
  6. 一个设置容器和网格布局的小技巧
  7. C Primer Plus 第8章 字符输入/输出和输入确认 8.11 编程练习答案
  8. QT编程之——使用全局变量
  9. 14章类型信息之使用类字面常量
  10. (转) mp4编码全介绍 (一)