题目:

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

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

你可以假设 nums1 和 nums2 不会同时为空。

示例1:

nums1 = [1, 3]

nums2 = [2]

则中位数是 2.0

示例2:

nums1 = [1, 2]

nums2 = [3, 4]

则中位数是 (2 + 3)/2 = 2.5

演示动画

分析

寻找两个有序数组的中位数,我们能够很快的联想到使用二分法寻找一个有序数组的中位数,它的时间复杂度就是O(log(n))。现在是有两个数组,时间复杂度要求的是O(log(m+n)),所以基本可以肯定就是和二分法有关了。

那么对于这个问题该如何使用二分发呢?我们进行进一步的分析。

既然是中位数,那么这个数的位置其实是可以确定的:

  • 对于m+n为奇数的情况,中位数就是第(m + n) / 2大的数。
  • 对于m+n为偶数的情况,中位数就是第(m + n) / 2大和第(m + n) / 2 + 1大的数的平均数。

所以我们可以把上面的问题转换为寻找两个有序数组中第k大的数,k = (m + n) / 2。

毫无疑问第k大的数有k1个来自于数组nums1,有k2个来自于数组nums2。由于k是确定的数,所以当k1确定的后,k2也就确定了。

所以我们可以在数组nums1中选一个k1,然后判断数组nums1的前k1个数和数组nums2的前k2个数是不是两个数组中最小的那一部分。判断条件为:

  1. nums1[k1 + 1] > nums[k2]
  2. nums2[k2 + 1] > nums[k1]

我们可以利用二分法来找这个k1。

实现代码:

判断给定的两个数是否是亲和数_动画演示LeetCode算法题:004-寻找两个有序数组的中位数...相关推荐

  1. 判断三角形java代码_打基础之LeetCode算法题第72篇:最大的三角形周长问题

    一直很纠结算法的文章应该怎么写.最后觉得还是从最简单的level开始写吧,一开始就弄些重量级的,什么人工智能,机器学习的算法,还要有大量的数学以及优化的知识,小白们估计会很郁闷,当然我也不一定能做出来 ...

  2. LeetCode算法题350:两个数组的交集II(Intersection of Two Arrays II)

    技术交流可以加: 本人微信:xcg852390212 本人qq:852390212 学习交流qq群1(已满): 962535112 学习交流qq群2: 780902027 两个数组的交集II Leet ...

  3. python【力扣LeetCode算法题库】—两数之和

    给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元 ...

  4. 数组越界怎么判断_算法连载之求解两个有序数组的中位数

    问题 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2.找出这两个有序数组的中位数.假设 nums1 和 nums2 不会同时为空. 示例 1: nums1 = [1, 3] num ...

  5. Java面试题:在一个递增的数组里面,找出任意两个数的和等于100,编写程序输出这些数对,可以假设数组中不存在重复元素

    本文使用两种算法来实现,分别是二分查找法和插值查找法,发现插值查找法更好,更快地找到需要的数据. 代码如下: package com.moson.search;import java.util.Arr ...

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

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

  7. return两个返回值_LeetCode 第四题 寻找两个有序数组的中位数

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

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

      之前讲解过一道数据流求中位数的题目,但是仔细一想觉得那一次对几种数据结构简单的分析了一下实现,并没有对中位数的题目做一个凝练总结,这一次借这个机会,好好整理一下思路. 题目描述   给定两个大小为 ...

  9. LeetCode4. 寻找两个有序数组的中位数(java)

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

最新文章

  1. ios开发-Storyboard在多个viewcontroller之间导航的实现
  2. java程序设计第一次作业
  3. 云栖新品|阿里云IoT发布云芯一体智能视觉解决方案
  4. 通过webbrowser实现js与winform的相互调用
  5. CM3计算板EC20模组拨号上网
  6. Dubbo-go v3.0 正式发布 ——打造国内一流开源 Go 服务框架
  7. python福利彩随机_看大神如何用Python分析福利彩票的秘密,百万大奖不是梦!
  8. 微信小程序,引爆新热点!JEECG社区小程序实战培训,业内首发,实战干货!
  9. 安装VMware16教程
  10. Vivado synth 8-439 module““not found问题绝对解决,超简单,想解决问题就看这里。
  11. 设计模式:简单的鸭子模型(入门)
  12. java 键盘 映射 控制游戏_如何运用JAVA程序设计进行键盘控制游戏
  13. 五步恢复XP系统“桌面清理向导”
  14. 常用的用户认证方式详解JWT
  15. Par.ici法语听写练习A1 -L13
  16. 【C++】宏定义函数指针类型
  17. 《四世同堂》金句摘抄(十)
  18. 啊!啊!啊!IEEE754移码偏移值的127!
  19. 那些辞职创业的互联网人现在怎么样了?
  20. Texworks编辑器字体设置

热门文章

  1. php 打印 trace,php xdebug trace 调试的问题
  2. android 9.0 权限管理_你真的了解Android权限机制吗?
  3. html自动切换文字,JS实现自动切换文字的导航效果代码
  4. 解决centos sudo执行仍旧显示Permission denied
  5. w ndows太卡,用Windows 10太卡?教你快速干掉Windows Defender
  6. arcgis server mysql_ArcGIS Server 10.1发布要素服务时遇到的数据库注册问题总结 (二)...
  7. Redis主从读写分离配置
  8. vue 右键菜单插件 简单、可扩展、样式自定义的右键菜单
  9. Http实现文件下载
  10. 自学it18大数据笔记-第一阶段Java-day16-day17-day18-day19--day20-day21-day22——会持续更新...