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

题目大意

给定两个大小为 m 和 n 的有序数组 nums1nums2

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

题目假设 nums1nums2 不会同时为空。

解题思路

根据题目要求,时间复杂度为O(log(m+n))O(log(m + n))O(log(m+n)),因此无法使用归并排序再查找中位数的方法,需要采用二分查找法。又因题目中所给的数组为有序数组,所以可以将问题简化为寻找两个数组中第k小的数。通过比较A[(m + n) / 2 - 1]B[(m + n) / 2 - 1],对数组中的数字进行排除并更新k值。

例如:
m + n = 14k初始为7,比较A数组和B数组中的第三个元素即A[2]B[2]的大小。
比较之后,值更小的数组去除第三个元素以及前面的元素,并更新k值,此时k = k - 去掉的元素个数,然后重复上述过程。
PS: 遇到相同值时随机选取一边进行删除
最后当k = 1时,中位数即为当前两个数组的最小值min{A[k],B[k]}

代码

def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:def getKthValue(k):# index 为数组的左边界index1, index2 = 0, 0while True:if index1 == m:# 左边界 + K - 1return nums2[index2 + k - 1]if index2 == n:return nums1[index1 + k - 1]if k == 1:return min(nums1[index1], nums2[index2])newIndex1 = min(index1 + k // 2 - 1, m - 1)newIndex2 = min(index2 + k // 2 - 1, n - 1)value1, value2 = nums1[newIndex1], nums2[newIndex2]if value1 <= value2:# k 减去'删除掉的元素个数'k -= newIndex1 - index1 + 1# 修改左边界index1 = newIndex1 + 1else:k -= newIndex2 - index2 + 1index2 = newIndex2 + 1m, n = len(nums1), len(nums2)length = m + nif length % 2 == 1:return getKthValue((length + 1) // 2)else:return (getKthValue((length // 2)) + getKthValue(length // 2 + 1)) / 2

LeetCode(Python实现)—寻找两个有序数组的中位数相关推荐

  1. 20191016:(leetcode习题)寻找两个有序数组的中位数

    寻找两个有序数组的中位数 题目 大致思路 代码实现 题目 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log( ...

  2. LeetCode实战:寻找两个有序数组的中位数

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

  3. leetcode C++ 4. 寻找两个有序数组的中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log

    一.概述: 这道题思路其实蛮简单的,就是边界太难考虑了,所以一直没能通过,写了好长的代码考虑边界,然后看到一个大神写的代码: https://leetcode-cn.com/problems/medi ...

  4. leetcode算法题--寻找两个有序数组的中位数★★

    原文链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/ 图示(来源): double findMedianSortedAr ...

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

    Python寻找两个有序数组的中位数 审题: 找出意味着这是一个查找算法题 算法复杂度log级别,就是提示你是二分查找 二分查找实现一般为递归 (1)递归包括递归体 (2)终止条件 思路: 定理: 有 ...

  6. 算法--------------------寻找两个有序数组的中位数

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

  7. 两个有序数组的中位数 python_Python寻找两个有序数组的中位数实例详解

    Python寻找两个有序数组的中位数 审题: 1.找出意味着这是一个查找算法题 2.算法复杂度log级别,就是提示你是二分查找 3.二分查找实现一般为递归 (1)递归包括递归体 (2)终止条件 思路: ...

  8. Leetcode算法题:两个有序数组求中位数

    Leetcode算法题:两个有序数组求中位数 要求时间复杂度为O(log(m+n)) 思路: 暴力解决:合并数组并排序,简单且一定能实现,时间复杂度O(m+n) 由于两个数组已经排好序,可一边排序一边 ...

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

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

最新文章

  1. 程序员自学编程创立 GREE,推出世界上第一款手机社交游戏,白手起家成为亚洲最年轻的巨富...
  2. OpenGL鼠标拾取
  3. Codeforces Round #479 (Div. 3)【完结】
  4. Python Django 设置/更改响应头信息
  5. Activity动态增加Fragment
  6. 自定义线程池-java内置线程池构造方法介绍
  7. 等重构完这系统,我就辞职!
  8. 用ssh从ubuntu系统向ubuntu系统服务器发送文件
  9. LabView学习笔记(二):滤波器实验
  10. 如果让AI来续写这些小说……
  11. Yandex-好用的以图搜图网站
  12. RabbitMmq基础(三)入门应用
  13. CSP考试 2016年04月第3题 路径解析 C++实现
  14. 计算机专业试讲10分钟教案,幼儿园10分钟试讲教案
  15. 深圳app上架-2021年上半年android ios app上架价格一览
  16. win10巨帧数据包在哪里设置_电脑和路由器mtu值怎样设置才网速最快
  17. 一铲子下去,服务器全瘫痪......
  18. 计算机绘图cad2016,帮忙用cad画图计算机绘图线下形考册2016秋
  19. img图片加载错误时显示默认图片
  20. 单位计算机网络管理员论文,计算机专业毕业论文(计算机网络管理软件的研究)教案.doc...

热门文章

  1. pytorch中 reshape函数解析
  2. 计算机电源5v有多大电流,跪求指教,谢谢!!! 电源怎么看多少W啊
  3. 芯片量产测试常用“黑话”
  4. 产品经理眼里的数据可视化产品定位
  5. ajax的x-www-form-urlencoded与json格式解决跨域问题
  6. 如何建立您的电子商务邮件列表?
  7. 云起实验室:基于函数计算实现AI推理
  8. Gin + Zap + Go Module 的结合使用
  9. 使用Log4J2.properties作为Spring Boot的日志工具
  10. 非结构化数据存储方案