热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

js寻找两个数组的差集_leetcode4.寻找两个正序数组的中位数

leetcode4.寻找两个正序数组的中位数给定两个大小为m和n的正序(从小到大)数组nums1和nums2。请你找出这两个正序数组的中位数࿰

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

给定两个大小为 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


方法一:暴力法

思路:

首先考虑最简单的暴力法,没想到居然通过了。

直接将两个数组合并,排序,然后根据长度返回中位数即可。

排序可以写归并排序,这里直接调用sort函数了。

代码:

class Solution:def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:ans = nums1 + nums2ans.sort()n = len(ans)if n%2 == 0:return float((ans[n//2]+ans[(n//2)-1])/2)else:return float(ans[n//2])

结果:

358b89d46edcc3e24c817dccc89dfd6d.png

方法二:二分查找递归

思路:

上面的时间复杂度不符合要求,这个要求的复杂度需要采用二分法。我们可以把这个问题转换为找两个数组中第k小的数,那么找中位数,根据总长度的奇偶,就是调用这个函数一次,或者两次来取平均的过程。

总体的思路是,我们首先判断是否有一个数组是空,如果是的话,那么很简单,只是对另一个数组找中位数即可;若不是,再进行下面过程,判断总长度奇偶。如果总长度为奇数,只要找到最中间的那个元素,即可,设为第k小的数;若为偶数,则找到中间两个数,第k小和第k+1小,再取平均即可。

下面介绍如何找到第k小的数&#xff0c;我们使用二分法&#xff0c;上下数组分别取第numm&#61;k//2个数&#xff0c;进行对比&#xff0c;若nums1[numm] <&#61; nums2[numm]&#xff0c;则说明nums1的前面这numm个数肯定小于目标数&#xff0c;抛弃&#xff0c;反之抛弃nums2的前面numm个数&#xff1b;下面问题就转换为在调整完&#xff08;抛弃掉没用的数&#xff09;之后的两个数组中&#xff0c;找第k-numm小的数的问题&#xff0c;就可以继续递归了。简单流程如下图所示。

c826adb1e524fd93f6ef3b4a47ae9b5f.png

此时numm&#61;&#61;2&#xff0c;两个数组的第二个元素&#xff0c;nums1的比较大&#xff0c;那么nums2的前numm个元素就抛弃掉&#xff0c;如下图黄色部分抛弃掉&#xff0c;然后问题就转换为剩下两个数组中找第2小的数。

4454df9d15113d9ceeab13b642406e88.png

问题转换为如图示问题。

29e3eae51e77fd12882b49da08d67301.png

由于2 <5&#xff0c;把nums1的前numm个元素删除掉&#xff0c;即把2删除掉&#xff0c;那么问题转换为。

32704ce72e52538b5e149506e257dada.png

由于此时就是找最小的数&#xff0c;不需要再二分&#xff0c;直接返回两个数组比较小的第一个数即可。这也是我们递归的一种边界条件&#xff0c;为了节约空间&#xff0c;我们不将数组传入递归函数&#xff0c;不对数组进行改变&#xff0c;只使用left1、right1、left2、right2表示nums1和nums2的搜索范围&#xff0c;t表示找第t的数。那么我们的递归终止条件有&#xff1a;

  • 其中一个数组的left大于right了&#xff0c;说明这个数组在上一层已经全部被抛弃了&#xff08;上一层在调整边界时&#xff0c;左边界要加上抛弃的长度&#xff0c;全部抛弃的时候&#xff0c;得到的新的左边界&#xff0c;刚好超过右边界。&#xff09;&#xff0c;只要返回另一个数组的第t小数即可&#xff0c;即nums[left&#43;t-1]。
  • 两个数组都还有数&#xff0c;t&#61;&#61;1&#xff0c;只要比较两个数组第一个元素&#xff0c;返回小的即可。

这里面还有一个小小的问题&#xff0c;我们在计算numm的时候&#xff0c;如果数组剩余的长度right-left&#43;1不足numm时候&#xff0c;我们就直接使用right的数来进行判断&#xff0c;因此表示参与抛弃的长度的时候&#xff0c;我们需要与现存数组长度进行判断&#xff0c;取小的。length1 &#61; min(numm,right1-left1&#43;1) 、length2 &#61; min(numm,right2-left2&#43;1)。

代码&#xff1a;

class Solution:def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:#找到nums1和nums2固定范围内的第t小的数&#xff0c;left1、right1、left2、right2为nums1和nums2的范围。def find(left1,right1,left2,right2,t): if left1 > right1: #此时其中一个数组已经无用&#xff0c;返回另一个数组的第t即可return nums2[left2&#43;t-1]elif left2 > right2: #此时其中一个数组已经无用&#xff0c;返回另一个数组的第t即可return nums1[left1&#43;t-1]if t &#61;&#61; 1: #两数组都存在的递归结束条件&#xff0c;找最小的一个数return min(nums1[left1],nums2[left2])numm &#61; t//2 #二分&#xff0c;向下取整&#xff0c;最多为t的一半#处理其中一个数组范围不足numm的情况&#xff0c;length表示判断之后丢弃的数的个数length1 &#61; min(numm,right1-left1&#43;1) length2 &#61; min(numm,right2-left2&#43;1)#判断left&#43;length-1的两个元素大小&#xff0c;调整两个数组的范围以及第几小元素&#xff0c;进行递归if nums1[left1&#43;length1-1] <&#61; nums2[left2&#43;length2-1]:return find(left1&#43;length1,right1,left2,right2,t-length1)else:return find(left1,right1,left2&#43;length2,right2,t-length2) m &#61; len(nums1)n &#61; len(nums2)#初始判断&#xff0c;处理其中有一个为空的情况if m &#61;&#61; 0:if n%2 &#61;&#61; 0:return float((nums2[n//2]&#43;nums2[(n//2)-1])/2)else:return float(nums2[n//2])if n &#61;&#61; 0:if m%2 &#61;&#61; 0:return float((nums1[m//2]&#43;nums1[(m//2)-1])/2)else:return float(nums1[m//2])ans &#61; 0.0#分两种情况讨论返回if (m &#43; n)%2 &#61;&#61; 1:k &#61; (m&#43;n&#43;1)//2ans &#61; float(find(0,m-1,0,n-1,k))else:k &#61; (m&#43;n)//2ans &#61; (float(find(0,m-1,0,n-1,k)) &#43; float(find(0,m-1,0,n-1,k&#43;1)))/2return ans

结果&#xff1a;

0cd65a6899fdeb4fc614481185d2fb22.png



推荐阅读
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
author-avatar
mobiledu2502894591
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有