Leetcode4-寻找两个正序数组的中位数原理及代码实现
LeetCode4 hard
题目
寻找两个正序数组的中位数
给定两个大小为m和n的正序(从小到大)数组nums1和nums2.请你找出这两个正序数组的中位数,并且要求算法时间复杂度为O(log(m+n)).
解题思路
1. 简单算法 O(m+n)
将两个数组合并成一个,利用自带的排序函数使合并后的数组有序。根据下标返回中位数。但这样时间复杂度是O(m+n),不符合题目要求。
class Solution:#64ms 33.73% O(m+n)def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:nums1.extend(nums2)nums1.sort()length=len(nums1)if length%2==0:return (nums1[length//2-1]+nums1[length//2])/2return nums1[length//2]
2. 二分法 O(log(m+n))
如果对时间复杂度要求有log,通常需要用到二分查找。
寻找中位数的问题实质上是寻找第k小的数。我们比较两个数组中第k/2小的数,较小的数及他之前的数一定不会是第k小的数,这样我们每次比较可以排除一半的数,达到了O(log(m+n))的时间复杂度。当然,有一些特殊情况需要单独考虑。
class Solution:#56ms 66.72% O(log(m+n))def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:def getKthMin(k:int, nums1: List[int], nums2: List[int])->int:#特殊情况1,某一个数组为空,则直接在另一个数据找到第k小的值if not nums1:return nums2[k - 1]if not nums2:return nums1[k - 1]#特殊情况2,k==1即返回最小值if k==1:return nums1[0] if nums1[0]<=nums2[0] else nums2[0]#特殊情况3,第k//2个元素超过索引,则直接比较最后一个元素与另一个数据对应元素,此时排除的元素个数是len(较短数组),而不是k//2nums11, nums22 = nums1, nums2if k//2>len(nums2):nums11, nums22 = nums2, nums1if k//2>len(nums11):if nums11[-1]<=nums22[len(nums11)-1]:k-=len(nums11)return nums22[k - 1]else:g=k-len(nums11)return getKthMin(g, nums11, nums22[len(nums11):])#正常情况,如果nums1的元素较小,则nums1位于比较位置之前的元素一定不是第k小的元素,被排除。下一次比较从nums1的下一个位置算起。if nums1[k//2-1]<=nums2[k//2-1]:g=k-k//2return getKthMin(g,nums1[k//2:], nums2)else:g=k-k//2return getKthMin(g, nums1, nums2[k//2:])#如果总长度为偶数,中位数则为二者平均值length=len(nums1)+len(nums2)if length%2==0:return (getKthMin(length//2, nums1, nums2)+getKthMin(length//2+1, nums1, nums2))/2else:return getKthMin(length // 2 + 1, nums1, nums2)
Leetcode4-寻找两个正序数组的中位数原理及代码实现相关推荐
- LeetCode 4 寻找两个正序数组的中位数
https://leetcode-cn.com/problems/median-of-two-sorted-arra 解决方案 Go 版本 func findMedianSortedArrays(nu ...
- 【LeetCode】4.寻找两个正序数组的中位数
4.寻找两个正序数组的中位数 一.问题描述 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的 中位数 . 二.问题简化 所谓中位数,就 ...
- 【LeetCode】【HOT】4. 寻找两个正序数组的中位数(二分查找)
[LeetCode][HOT]4. 寻找两个正序数组的中位数 文章目录 [LeetCode][HOT]4. 寻找两个正序数组的中位数 package hot;public class Solution ...
- [二分搜索|快速选择] leetcode 4 寻找两个正序数组的中位数
[二分搜索|快速选择] leetcode 4 寻找两个正序数组的中位数 1.题目 题目链接 给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组 ...
- 2022-6-13 全O(1)的数据结构,两数相加,无重复字符的最长子串,寻找两个正序数组的中位数,盛最多水的容器,......
1. 全 O(1) 的数据结构 Design a data structure to store the strings' count with the ability to return the s ...
- 寻找两个正序数组的中位数
寻找两个正序数组的中位数 时隔许久,我又回来了. 题目:给定两个大小分别为m和n的正序(从小到大)数组nums1和nums2.请你找出并返回这两个正序数组的中位数. 要求算法的时间复杂度为O(log( ...
- java打乱一组正序数字,Leetcode︱4.Median of Two Sorted Arrays寻找两个正序数组的中位数.java...
题目 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的 中位数 . 示例 : 输入:nums1 = [1,3], nums2 = [2 ...
- 算法:寻找两个正序数组的中位数。
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2. 请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 ...
- 寻找两个正序数组的中位数——冒泡排序(归并排序)
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的 中位数 . 冒泡算法 class Solution {public double f ...
最新文章
- Netty实现心跳机制与断线重连
- php日历如何写,如何写一个好看的实用的日历
- 将公平注入AI:机器学习模型即使在不公平数据上训练也能产生公平输出
- [导入]LINQ体验(11)——LINQ to SQL语句之Null语义和String/DateTime方法
- pyqt5必须和python对应_python 使用PyQt5
- 54. 二叉搜索树的第k大节点
- PixelShuffle特征图的上采样的方法
- 在ASP.NET中使用Session常见问题集锦
- CentOs6.6安装Python3
- STL容器 之 list
- 大数据资料 下载0积分
- 【职场加油站】给职场新人的几条忠告
- C#_串口调试助手-扫描可用串口
- 实现全球同服,保障业务出海——腾讯云跨域加速解决方案
- 头歌Educoder——JDBC基础编程练习
- java计算机毕业设计校园爱心公益平台设计与实现MyBatis+系统+LW文档+源码+调试部署
- php 成语接龙api,再谈Weiphp公众平台开发——1、成语接龙插件
- SAP中库存确定组的应用简析
- 想要制作令人震撼的大屏可视化,要如何提升自己的可视化效果?
- jmp指令【原理详解 8086汇编语言+笔记】
热门文章
- 再说 Spring AOP
- 使用HashiCorp Nomad按需分配容器存储
- feign调用session丢失解决方案
- 三大工厂模式的优缺点
- mysql数据库array_mysql数据库array
- 如何正确使用穿线管 穿线管布局解析
- java棋盘问题_0x03大数问题(JAVA解决棋盘覆盖,A+B Problem II)
- 用python做毕业设计小程序_用Python写一个模拟qq聊天小程序的代码实例
- Python之pandas:数据类型变换之object、category、bool、int32、int64、float64以及数据类型标准化之详细攻略
- DL之ShuffleNet:ShuffleNet算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略