LeetCode(Python实现)—寻找两个有序数组的中位数
4.寻找两个有序数组的中位数
题目大意
给定两个大小为 m 和 n 的有序数组 nums1
和 nums2
。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
题目假设 nums1
和 nums2
不会同时为空。
解题思路
根据题目要求,时间复杂度为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 = 14
则 k
初始为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实现)—寻找两个有序数组的中位数相关推荐
- 20191016:(leetcode习题)寻找两个有序数组的中位数
寻找两个有序数组的中位数 题目 大致思路 代码实现 题目 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log( ...
- LeetCode实战:寻找两个有序数组的中位数
题目英文 There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of th ...
- leetcode C++ 4. 寻找两个有序数组的中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log
一.概述: 这道题思路其实蛮简单的,就是边界太难考虑了,所以一直没能通过,写了好长的代码考虑边界,然后看到一个大神写的代码: https://leetcode-cn.com/problems/medi ...
- leetcode算法题--寻找两个有序数组的中位数★★
原文链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/ 图示(来源): double findMedianSortedAr ...
- Python寻找两个有序数组的中位数
Python寻找两个有序数组的中位数 审题: 找出意味着这是一个查找算法题 算法复杂度log级别,就是提示你是二分查找 二分查找实现一般为递归 (1)递归包括递归体 (2)终止条件 思路: 定理: 有 ...
- 算法--------------------寻找两个有序数组的中位数
题目描述 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2.请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)).你可以假设 nums1 和 num ...
- 两个有序数组的中位数 python_Python寻找两个有序数组的中位数实例详解
Python寻找两个有序数组的中位数 审题: 1.找出意味着这是一个查找算法题 2.算法复杂度log级别,就是提示你是二分查找 3.二分查找实现一般为递归 (1)递归包括递归体 (2)终止条件 思路: ...
- Leetcode算法题:两个有序数组求中位数
Leetcode算法题:两个有序数组求中位数 要求时间复杂度为O(log(m+n)) 思路: 暴力解决:合并数组并排序,简单且一定能实现,时间复杂度O(m+n) 由于两个数组已经排好序,可一边排序一边 ...
- LeetCode4. 寻找两个有序数组的中位数
4. 寻找两个有序数组的中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假 ...
最新文章
- 程序员自学编程创立 GREE,推出世界上第一款手机社交游戏,白手起家成为亚洲最年轻的巨富...
- OpenGL鼠标拾取
- Codeforces Round #479 (Div. 3)【完结】
- Python Django 设置/更改响应头信息
- Activity动态增加Fragment
- 自定义线程池-java内置线程池构造方法介绍
- 等重构完这系统,我就辞职!
- 用ssh从ubuntu系统向ubuntu系统服务器发送文件
- LabView学习笔记(二):滤波器实验
- 如果让AI来续写这些小说……
- Yandex-好用的以图搜图网站
- RabbitMmq基础(三)入门应用
- CSP考试 2016年04月第3题 路径解析 C++实现
- 计算机专业试讲10分钟教案,幼儿园10分钟试讲教案
- 深圳app上架-2021年上半年android ios app上架价格一览
- win10巨帧数据包在哪里设置_电脑和路由器mtu值怎样设置才网速最快
- 一铲子下去,服务器全瘫痪......
- 计算机绘图cad2016,帮忙用cad画图计算机绘图线下形考册2016秋
- img图片加载错误时显示默认图片
- 单位计算机网络管理员论文,计算机专业毕业论文(计算机网络管理软件的研究)教案.doc...