给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。

请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

如果不考虑复杂度的话这个题目很简单:将两个数组合并为一个数组,然后用冒泡排序算法将合并后的数组进行排序,然后用二分法找出中间的数,但是这个复杂度远远超过O(log(m + n)),因为光冒泡排序就是O(n^2)。今天在leetcode上看了半个小时,也没有想明白大神的解法,明天去找国外的导师汇报完后回来继续看,明天争取解出来,然后着手写自己国内的论文和做语音识别的仿真。坚持就是胜利。先粘贴过来大神的解法。

#include <stdio.h>
#include <vector>
using namespace std;

#define max(a,b) (((a) > (b)) ? (a) : (b))
#define min(a,b) (((a) < (b)) ? (a) : (b))

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int n = nums1.size();
        int m = nums2.size();

if (n > m)  //保证数组1一定最短
        {
            return findMedianSortedArrays(nums2, nums1);
        }

// Ci 为第i个数组的割,比如C1为2时表示第1个数组只有2个元素。LMaxi为第i个数组割后的左元素。RMini为第i个数组割后的右元素。
        int LMax1, LMax2, RMin1, RMin2, c1, c2, lo = 0, hi = 2 * n;  //我们目前是虚拟加了'#'所以数组1是2*n长度

while (lo <= hi)   //二分
        {
            c1 = (lo + hi) / 2;  //c1是二分的结果
            c2 = m + n - c1;

LMax1 = (c1 == 0) ? INT_MIN : nums1[(c1 - 1) / 2];
            RMin1 = (c1 == 2 * n) ? INT_MAX : nums1[c1 / 2];
            LMax2 = (c2 == 0) ? INT_MIN : nums2[(c2 - 1) / 2];
            RMin2 = (c2 == 2 * m) ? INT_MAX : nums2[c2 / 2];

if (LMax1 > RMin2)
                hi = c1 - 1;
            else if (LMax2 > RMin1)
                lo = c1 + 1;
            else
                break;
        }
        return (max(LMax1, LMax2) + min(RMin1, RMin2)) / 2.0;
    }
};

int main(int argc, char *argv[])
{
    vector<int> nums1 = { 2,3, 5 };
    vector<int> nums2 = { 1,4,7, 9 };
    
    Solution solution;
    double ret = solution.findMedianSortedArrays(nums1, nums2);
    return 0;
}

作者:bian-bian-xiong
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/solution/4-xun-zhao-liang-ge-you-xu-shu-zu-de-zhong-wei-shu/
来源:力扣(LeetCode)。

C++leetcode找出两个有序数组的中位数(2)相关推荐

  1. leetcode 4. 寻找两个有序数组的中位数,c语言

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

  2. LeetCode 4. 寻找两个有序数组的中位数(二分查找,难)

    文章目录 1. 题目 2. 解题 2.1 合并数组 2.2 优化2.1解法,双指针 2.3 二分法(找第k个数) 2.4 切分法 1. 题目 给定两个大小为 m 和 n 的有序数组 nums1 和 n ...

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

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

  4. [leetcode] 4 寻找两个有序数组的中位数(二分+递归查找第K小数)(重要)

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

  5. Leetcode(4)寻找两个有序数组的中位数

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

  6. LeetCode 4.寻找两个有序数组的中位数

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

  7. Algs4-1.4.12找出两个有序数组的公共元素-方法1

    1.4.12编写一个程序,有序打印给定的两个有序数组(含有N个int值)中的所有公共元素,程序在最坏情况下所需的运行时间应该和N成比. 答: import java.util.Arrays; publ ...

  8. leetcode 4 --- 寻找两个有序数组的中位数

    1 题目 给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的中位数. 进阶:设计一个时间复杂度为 O(log (m+n)) 的算法. 2 解 ...

  9. [leetcode] 4. 寻找两个有序数组的中位数

    官方题解:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/solution/xun-zhao-liang-ge-you-xu- ...

最新文章

  1. android system window,Android控件的fitSystemWindows属性
  2. python byte和string转换
  3. 30KVA UPS电源安装电线的配置
  4. Android 小项目之--数据存储【Network】(附源码)
  5. php集成paypal接口,PHP中集成PayPal标准支付,php集成paypal标准_PHP教程
  6. 统计数据:Google排名高的是什么样的页面?
  7. win10电脑开机密码忘了怎么办_电脑开机密码忘了怎么办最简单的方法_windows7教程...
  8. LEADTOOLS构建HTML5 DICOM/PACS查看器
  9. Atitit 知识图谱解决方案:提供完整知识体系架构的搜索与知识结果overview
  10. 超星pdg格式转换为pdf格式原理方法
  11. sqlplus连接mysql_sqlplus连接的三种方式
  12. 通信系统仿真原理与无线应用笔记-MATLAB
  13. 如何打开计算机无线功能灰色,计算机没有wifi,仅显示宽带连接. 右键单击灰色的无线网络连接图...
  14. 冯森林:手机淘宝中的那些Web技术
  15. Android go app 安装包,安卓go系统刷机
  16. 解决Pr cc 2019主页加载不出来的问题
  17. Liunx配置jdk
  18. Excel高级图表制作④——控件+Offset组合,让图表真正动起来!
  19. 树梅派切换源_树莓派—raspbian软件源(全)
  20. error: variable has incomplete type ‘QApplication‘ 错误解决

热门文章

  1. HOW TO ORDER LFT
  2. 积极的活下去本身就是挺好的一件事情了
  3. Disruptor-net
  4. docker学习笔记-为容器配置重启策略
  5. SpringMvc 集成 shiro 实现权限角色管理-maven
  6. C中结构体的存储分配
  7. JavaScipt中的Math.ceil() 、Math.floor() 、Math.round()
  8. 【读书】正则指引-3-括号
  9. redis on windows
  10. POJ-1459 Power Network 网络流