1. 难度系数:5
  2. /***************************************************************************
  3. 题目:有两个排好序的数组,要求其中位数,时间复杂度控制在O(log(m+n))
  4. 一般化:求两个排序数组的第K大的元素
  5. 直观思路1:PA和PB首先指向这两个子数组,对比比较,A小则PA++,m++,B小则
  6. PB++,m++,直至m==k ======>> 时间复杂度O(m+n)
  7. 正解思路:
  8. 由于数组是有序的,又是有序的,能否通过二分等思路来可能筛掉一些元素
  9. 关键是设计一种方案让其收敛到最终位置
  10. 尝试二分: 若Amid<Bmid,cutA前一半,B后一半,
  11. 能确定的是A前一半小于A后一半以及B后一半。
  12. A------------cut---------------
  13. B------cut--------
  14. 那么A的前一半不可能是中位数,筛掉,要是Bmid小呢,只能筛掉B的前一半
  15. 这样不稳定
  16. 如果以K的一半为标准呢:
  17. A[k/2-1]==B[k/2-1],说明AB的前k/2-1+k/2-1=k-2个元素在topK内
  18. 那么 A[k/2-1]便是第K-1和第K大的数(K为偶数)
  19. A[K/2-1]>B[k/2-1] 去除掉A数组前K/2元素(实际最大能去除整个数组元素)
  20. A[K/2-1]<B[k/2-1]
  21. step1:当A或B是空时,直接返回A[K-1]或者B[k-1]
  22. step2:当K=1,返回min[A[0],B[0]]
  23. step3:当A[K/2-1]==B[k/2-1] 返回A[K/2-1]
  24. ************************************************************/
  1. class Solution{
  2. public:
  3. double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2){
  4. int m = nums1.size(),n = nums2.size();
  5. int total = m+n;
  6. cout<<total<<endl;
  7. if(total&0x1)
  8. return find_k(&nums1[0],m,&nums2[0],n,total/2+1);
  9. else
  10. {
  11. return (find_k(&nums1[0],m,&nums2[0],n,total/2)
  12. +find_k(&nums1[0],m,&nums2[0],n,total/2+1))/2.0;
  13. }
  14. }
  15. private:
  16. static int find_k(int A[],int m,int B[],int n,int k)
  17. {
  18. if(m>n)return find_k(B,n,A,m,k);
  19. if(m==0) return B[k-1];
  20. if(k==1)return min(A[0],B[0]);
  21. int ia = min(m,k/2),ib = k-ia;
  22. if(A[ia-1]<B[ib-1]) return find_k(A+ia,m-ia,B,n,ib);
  23. else if(A[ia-1]>B[ib-1])
  24. return find_k(A,m,B+ib,n-ib,k-ib);
  25. else return A[ia-1];
  26. }
  27. };
  28. int main()
  29. {
  30. int a[]={1,3,5,7,9};
  31. int b[]={2,4,6};
  32. Solution S;
  33. vector<int> B(b,b+3),A(a,a+5);
  34. cout<<S.findMedianSortedArrays(A,B)<<endl;
  35. return 0;
  36. }

3.Median of Two Sorted Arrays Leetcode的更多相关文章

  1. Median of Two Sorted Arrays LeetCode Java

    两排序好的数组,找中位数 描述There are two sorted arrays A and B of size m and n respectively. Find the median of ...

  2. 4. Median of Two Sorted Arrays(topK-logk)

    4. Median of Two Sorted Arrays 题目 There are two sorted arrays nums1 and nums2 of size m and n respec ...

  3. 【算法之美】求解两个有序数组的中位数 — leetcode 4. Median of Two Sorted Arrays

    一道非常经典的题目,Median of Two Sorted Arrays.(PS:leetcode 我已经做了 190 道,欢迎围观全部题解 https://github.com/hanzichi/ ...

  4. LeetCode 4 Median of Two Sorted Arrays (两个数组的mid值)

    题目来源:https://leetcode.com/problems/median-of-two-sorted-arrays/ There are two sorted arrays nums1 an ...

  5. LeetCode(3) || Median of Two Sorted Arrays

    LeetCode(3) || Median of Two Sorted Arrays 题记 之前做了3题,感觉难度一般,没想到突然来了这道比较难的,星期六花了一天的时间才做完,可见以前基础太差了. 题 ...

  6. Kotlin实现LeetCode算法题之Median of Two Sorted Arrays

    题目Median of Two Sorted Arrays(难度Hard) 方案1,数组合并&排序调用Java方法 import java.util.* class Solution { fu ...

  7. Leetcode 4. Median of Two Sorted Arrays(二分)

    4. Median of Two Sorted Arrays 题目链接:https://leetcode.com/problems/median-of-two-sorted-arrays/ Descr ...

  8. leetcode第四题:Median of Two Sorted Arrays (java)

    Median of Two Sorted Arrays There are two sorted arrays A and B of size m and n respectively. Find t ...

  9. LeetCode 4. Median of Two Sorted Arrays & 归并排序

    Median of Two Sorted Arrays 搜索时间复杂度的时候,看到归并排序比较适合这个题目.中位数直接取即可,所以重点是排序. 再来看看治阶段,我们需要将两个已经有序的子序列合并成一个 ...

随机推荐

  1. elasticsearch的索引操作

    1.创建索引(test_index) curl -XPUT "http://192.168.99.1:9200/test_index" 2.创建索引,指定分片和副本的数量 curl ...

  2. (四)、Docker 镜像

    1.Docker镜像是什么? 镜像是一种轻量级.可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码.运行时.库.环境变量和配置文件. 2.Do ...

  3. Noip模拟34 2021.8.9

    T1 Merchant 一眼二分,然后想了想维护凸包,好像并没有什么关系, 然后又想了想维护一个栈,发现跳指针细节过多不想打 最后直接打了二分,大点跑的飞快,感觉比较稳,出来$78$分 是没用神奇的$ ...

  4. DDD领域驱动设计-项目包结构说明-Ⅳ

     基于DDD领域驱动设计的思想,在开发具体系统时,需要先建立不同的层级包.主要是梳理不同层面(应用层,领域层,基础设施层,展示层)包括的功能目录,每一个层面应该包括哪些模块.本例所讲述的分层是DDD落 ...

  5. python 3 range函数类型

    在python3中 print(range(10))range(0,10) 得出的结果是 range(0,10) ,而不是[0,1,2,3,4,5,6,7,8,9] ,为什么呢?而且原来Python2 ...

  6. hdu 1028 Ignatius and the Princess III(母函数)

    题意: N=a[1]+a[2]+a[3]+...+a[m];  a[i]>0,1<=m<=N; 例如: 4 = 4;  4 = 3 + 1;  4 = 2 + 2;  4 = 2 + ...

  7. Obsidian中使用Calendar插件快捷建立日记、周记

    Calendar插件 Calendar插件是我第一个安装使用的插件,插件可以帮助我们很便捷的记录每天的工作 插件效果图 插件下载 下载地址 插件安装 # Obsidian如何手动下载并安装插件-以看板 ...

  8. robot_framewok自动化测试--(7)认识RIDE

    认识 RIDE RIDE 作为 Robot Framework 的"脸面",虽然我们已经可以拿它来创建和运行测试了,但我们对它的认识并不全面,这一小节我们将了解这个工具的使用. 1 ...

  9. DOS常用基本命令

    通配符* 和 ? *表示一个字符串 ?只代表一个字符 注意通配符只能通配文件名或扩展名,不能全都表示.例如我们要查找以字母y开头的所有文件,可以输入以下命令: dir y*.* 例如我要查找第二个字母 ...

  10. 终论到底该不该写isDebugEnabled

    以前: 很多日志框架都不支持{}模板的写法(如Log4j1.X, Apache Commons Logging),于是只能通过字符串拼接来输出日志内容: log.debug("debug日志 ...