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-寻找两个正序数组的中位数原理及代码实现相关推荐

  1. LeetCode 4 寻找两个正序数组的中位数

    https://leetcode-cn.com/problems/median-of-two-sorted-arra 解决方案 Go 版本 func findMedianSortedArrays(nu ...

  2. 【LeetCode】4.寻找两个正序数组的中位数

    4.寻找两个正序数组的中位数 一.问题描述 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的 中位数 . 二.问题简化 所谓中位数,就 ...

  3. 【LeetCode】【HOT】4. 寻找两个正序数组的中位数(二分查找)

    [LeetCode][HOT]4. 寻找两个正序数组的中位数 文章目录 [LeetCode][HOT]4. 寻找两个正序数组的中位数 package hot;public class Solution ...

  4. [二分搜索|快速选择] leetcode 4 寻找两个正序数组的中位数

    [二分搜索|快速选择] leetcode 4 寻找两个正序数组的中位数 1.题目 题目链接 给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组 ...

  5. 2022-6-13 全O(1)的数据结构,两数相加,无重复字符的最长子串,寻找两个正序数组的中位数,盛最多水的容器,......

    1. 全 O(1) 的数据结构 Design a data structure to store the strings' count with the ability to return the s ...

  6. 寻找两个正序数组的中位数

    寻找两个正序数组的中位数 时隔许久,我又回来了. 题目:给定两个大小分别为m和n的正序(从小到大)数组nums1和nums2.请你找出并返回这两个正序数组的中位数. 要求算法的时间复杂度为O(log( ...

  7. java打乱一组正序数字,Leetcode︱4.Median of Two Sorted Arrays寻找两个正序数组的中位数.java...

    题目 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的 中位数 . 示例 : 输入:nums1 = [1,3], nums2 = [2 ...

  8. 算法:寻找两个正序数组的中位数。

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

  9. 寻找两个正序数组的中位数——冒泡排序(归并排序)

    给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的 中位数 . 冒泡算法 class Solution {public double f ...

最新文章

  1. Netty实现心跳机制与断线重连
  2. php日历如何写,如何写一个好看的实用的日历
  3. 将公平注入AI:机器学习模型即使在不公平数据上训练也能产生公平输出
  4. [导入]LINQ体验(11)——LINQ to SQL语句之Null语义和String/DateTime方法
  5. pyqt5必须和python对应_python 使用PyQt5
  6. 54. 二叉搜索树的第k大节点
  7. PixelShuffle特征图的上采样的方法
  8. 在ASP.NET中使用Session常见问题集锦
  9. CentOs6.6安装Python3
  10. STL容器 之 list
  11. 大数据资料 下载0积分
  12. 【职场加油站】给职场新人的几条忠告
  13. C#_串口调试助手-扫描可用串口
  14. 实现全球同服,保障业务出海——腾讯云跨域加速解决方案
  15. 头歌Educoder——JDBC基础编程练习
  16. java计算机毕业设计校园爱心公益平台设计与实现MyBatis+系统+LW文档+源码+调试部署
  17. php 成语接龙api,再谈Weiphp公众平台开发——1、成语接龙插件
  18. SAP中库存确定组的应用简析
  19. 想要制作令人震撼的大屏可视化,要如何提升自己的可视化效果?
  20. jmp指令【原理详解 8086汇编语言+笔记】

热门文章

  1. 再说 Spring AOP
  2. 使用HashiCorp Nomad按需分配容器存储
  3. feign调用session丢失解决方案
  4. 三大工厂模式的优缺点
  5. mysql数据库array_mysql数据库array
  6. 如何正确使用穿线管 穿线管布局解析
  7. java棋盘问题_0x03大数问题(JAVA解决棋盘覆盖,A+B Problem II)
  8. 用python做毕业设计小程序_用Python写一个模拟qq聊天小程序的代码实例
  9. Python之pandas:数据类型变换之object、category、bool、int32、int64、float64以及数据类型标准化之详细攻略
  10. DL之ShuffleNet:ShuffleNet算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略