4. Median of Two Sorted Arrays

文章目录

  • 1题目理解
  • 2 二分查找解题
    • 2.1中位数的定义
    • 2.2 数组切分
    • 2.3分析条件

1题目理解

输入:2个已经排序号的int数组nums1,nums2
输出:这两个数组合并后的中位数
要求:m是nums1的长度,n是nums2的长度。时间复杂度应该是O(log(m+n))。
例子:
nums1 = [1, 3]
nums2 = [2]

The median is 2.0

nums1 = [1, 2]
nums2 = [3, 4]

The median is (2 + 3)/2 = 2.5

2 二分查找解题

这道题目如果不要求时间复杂度的话,很简单。把两个数组合并。如果长度为奇数,找到中间位置的下标返回该元素。如果长度是偶数,则找到中间两个元素,求平均值返回。要符合时间复杂度要求就要用二分。以下内容来源于力扣,只看解法四。
这种解法在一刷的时候没看明白,现在二刷更清楚了。知道怎么从题目描述,到最终的条件。知道为什么这样做是对的。

2.1中位数的定义

中位数将一个数组分成两部分,左边元素个数等于右边元素个数,并且左边元素的值都小于右边元素的值。

2.2 数组切分

在数组中,我们在任意位置i,将数组切分为2部分。
在这里插入图片描述

由于数组A中有m个元素,所以数组A有m+1种切分方法。
i∈[0,m]i\in[0,m]i[0,m],那么
len(leftA)=i,len(rightA)=m−ilen(left_A)=i,len(right_A)=m-i len(leftA)=i,len(rightA)=mi

采用同样的方式,在位置j,将数组B切分为两部分。

j∈[0,n]j\in[0,n]j[0,n],那么
len(leftB)=j,len(rightB)=n−jlen(left_B)=j,len(right_B)=n-j len(leftB)=j,len(rightB)=nj

将left_A和left_B一起合并形成left_part,将right_A和right_B一起合并形成right_part。
在这里插入图片描述

当A和B的长度是偶数的时候,如果len(left_part)=len(right_part),并且max(left_part)<=min(right_part),
那么中位数=max(left_part)+min(right_part)2中位数=\dfrac{max(left\_part)+min(right\_part)}{2}=2max(left_part)+min(right_part)

当A和B的长度是奇数的时候,如果len(left_part)=len(right_part)+1,并且max(left_part)<=min(right_part),那么
中位数=max(left_part)中位数=max(left\_part)=max(left_part)

2.3分析条件

对于奇偶情况不同,长度条件不一样,我们可以做合并。要想得到中位数需要符合上面两个条件。这两个条件可以这样理解。

1 i+j=m-i+n-j (m+n为偶数)或者 i+j=m-i+n-j+1(m+n为奇数)。等号左侧是前一部分元素个数,等号右侧是后一部分元素个数。将i,j都转到等号左边,做变换,得到i+j=m+n+12i+j=\dfrac{m+n+1}{2}i+j=2m+n+1
具体过程是,m+n为偶数,对于i+j=m-i+n-j ,得到2*(i+j)=m+n,进一步i+j=m+n2i+j=\dfrac{m+n}{2}i+j=2m+n,因为m+n为偶数,其实m+n2=m+n+12\dfrac{m+n}{2}=\dfrac{m+n+1}{2}2m+n=2m+n+1。因为这里取的是整除,所以+1不会影响结果。例如42=2{\dfrac{4}{2}=2}24=2,4+1=5,52=2{\dfrac{5}{2}=2}25=2。所以此时,i+j=m+n+12i+j=\dfrac{m+n+1}{2}i+j=2m+n+1

m+n为奇数, i+j=m-i+n-j+1,得到2*(i+j)=m+n+1,进一步得到i+j=m+n+12i+j=\dfrac{m+n+1}{2}i+j=2m+n+1
所以条件1就是i+j=m+n+12i+j=\dfrac{m+n+1}{2}i+j=2m+n+1

2 0<=i<=m0<=i<=m0<=i<=m,0<=j<=n0<=j<=n0<=j<=n。如果我们规定m<=n,那么对于任意的i∈[0,m]i \in[0,m]i[0,m],都有j=m+n+12−i∈[0,n]j=\dfrac{m+n+1}{2}-i \in[0,n]j=2m+n+1i[0,n]。这是因为不能让j是负数。可以举一个反例。例如m=10,n=4,当i=9的时候,j=7-9就是负数了。

3 max(left_part)<=min(right_part),的等价条件是A[i-1]<=B[j]并且B[j-1]<=A[i]。我们可以对该条件做进一步分析。
首先因为数组切分可能切在数组开始,也可能切在数组末尾。也就是说i=0,也有i=m,j=0,j=n的情况。这个时候我们假设A[-1]=B[-1]=−∞-\infty,A[m+1]=B[n+1]=∞\infty。这样可以保证结果值不受影响。如果i=0,那么leftA=−∞left_A={-\infty}leftA=,最大值肯定来源于leftBleft_BleftB。所以结果不影响。其他同理。

接着,我们需要证明A[i-1]<=B[j]并且B[j-1]<=A[i] 等价于,找到最大的i使得A[i-1]<=B[j],j=m+n+12−ij=\dfrac{m+n+1}{2}-ij=2m+n+1i
这是因为当i从0到m主键增加,j会从n到0逐渐减小,A[i-1]递增,B[j]逐渐递减。总会找到一个最大的i,使得A[i-1]<=B[j]。
如果i是最大的,那说明i+1不满足,说明A[i]>B[j-1],也就是说B[j-1]<A[i]。和原来的条件要求是一样的。

因此,我们可以在[0,m]上找到最大的i,使得A[i-1]<=B[j],那么i,j就是切分点。前一部分元素的最大值,以及后一部分的最小值,才可能是数组的中位数。

class Solution {public double findMedianSortedArrays(int[] nums1, int[] nums2) {int m = nums1.length;int n = nums2.length;//第一个数组一定是短的,这是因为 我们要保证i和j都是大于0的数。因为l<=r的限制,那么如果i=m的时候,j就一定为负数了。if(m>n){return findMedianSortedArrays(nums2,nums1);}int l = 0, r =m;//A中元素有m个,有m+1种划分方法。这里的i表示leftA有几个元素。int median1=0,median2=0;while(l<=r){int i = (l+r)>>1;int j = (m+n+1)/2-i;int leftA = (i>0?nums1[i-1]:Integer.MIN_VALUE);int rightA = (i<m?nums1[i]:Integer.MAX_VALUE);int leftB = (j>0?nums2[j-1]:Integer.MIN_VALUE);int rightB = (j<n?nums2[j]:Integer.MAX_VALUE);if(leftA<=rightB){median1 = Math.max(leftA,leftB);median2 = Math.min(rightA,rightB);l = i+1;}else{r = i-1;}}return (m+n)%2==0?(median1+median2)/2.0:median1;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424248.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第九十三期:带你聊聊 Java 并发编程之线程基础

百丈高楼平地起&#xff0c;要想学好多线程&#xff0c;首先还是的了解一下线程的基础&#xff0c;这边文章将带着大家来了解一下线程的基础知识。 作者&#xff1a;小九 01、简介 百丈高楼平地起&#xff0c;要想学好多线程&#xff0c;首先还是的了解一下线程的基础&#x…

我们还有理想吗?

兴致勃勃从海边享受了几天,本来打算回来后在这里写上几篇.其中还准备了一篇名为"一千个不加班的理由".可笑的是今天就从梦中醒来.因为有几个项目要加快投标准备了.我唯一能做的是耸耸肩膀,公司的事情当然要做,现实就是现实!前几天和老同学突然谈起一个话题,别的行业的…

17. Letter Combinations of a Phone Number

1 题目理解 给定一个字符串string&#xff0c;字符范围是[2,9]之间的数字。数字表示电话上的一个按钮。返回字符串的可能所有组合方式。每个数字对应的字母如下图所示。 Example 1: Input: digits “23” Output: [“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”…

第九十四期:GitHub 发布 2019 年年度报告

GitHub 发布了 2019 年年度报告《The State of the Octoverse》&#xff0c;下边来看看一些主要数据。 作者&#xff1a;佚名 GitHub 发布了 2019 年年度报告《The State of the Octoverse》&#xff0c;下边来看看一些主要数据。 全球用户超过 4 千万 目前 GitHub 上有超过…

COM 组件设计与应用(十一)

COM 组件设计与应用&#xff08;十一&#xff09;IDispatch 及双接口的调用作者&#xff1a;杨老师 下载源代码一、前言 前段时间&#xff0c;由于工作比较忙&#xff0c;没有能及时地写作。其间收到了很多网友的来信询问和鼓励&#xff0c;在此一并表示感谢。咳......我也需…

39. Combination Sum

文章目录1题目理解2 回溯分析3 40. Combination Sum II3.1 延续39解题思路3.2 新思路3.3 递归计数的方式4 216. Combination Sum III1题目理解 Given an array of distinct integers candidates and a target integer target, return a list of all unique combinations of ca…

第九十五期:Python帮你识破双11的套路

一年一度的“双十一”又要来了&#xff0c;很多人已经开始摩拳擦掌&#xff0c;毕竟几天之后手还在不在就不好说了。 作者&#xff1a;清风小筑 各种社交软件也是跟着遭殃&#xff0c;整天就是“来帮我一起盖楼”&#xff0c;各种字体绕过屏蔽&#xff0c;什么奇葩的脑洞也出来…

客户端独立弹出详细的实现过程

拷贝粘贴以下代码段&#xff0c;保存为html文件&#xff0c;试试看效果如何吧。。。前几天贴子没写东西就搁在上面搁了几天&#xff0c;真不好意思。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" ><HTML><HEAD></HEAD>&…

Unity3D性能优化之Draw Call Batching

在屏幕上渲染物体&#xff0c;引擎需要发出一个绘制调用来访问图形API&#xff08;iOS系统中为OpenGL ES&#xff09;。每个绘制调用需要进行大量的工作来访问图形API&#xff0c;从而导致了CPU方面显著的性能开销。Unity在运行时可以将一些物体进行合并&#xff0c;从而用一个…

第九十六期:JavaScript 中的 4 个相等比较算法的介绍

JavaScript 运算中&#xff0c;一共包含 4 个相等比较算法&#xff1a;抽象相等比较&#xff1b;严格相等比较&#xff1b;SameValueZero&#xff1b;SameValue。 作者&#xff1a;zhangbao90s JavaScript 运算中&#xff0c;一共包含 4 个相等比较算法&#xff1a; 抽象相等…

第九十七期:新版Kite:实时补全代码,Python之父都发声力挺!

不久前&#xff0c;一个免费的专门针对 Python 的代码补全工具 Kite&#xff0c;有了新的动态。 作者&#xff1a;杨鲤萍 本文转自雷锋网&#xff0c;如需转载请至雷锋网官网申请授权。 不久前&#xff0c;一个免费的专门针对 Python 的代码补全工具 Kite&#xff0c;有了新…

svn 版本升级的问题

原创文章&#xff0c;转载请注明 svn本地版本由1.6升级到1.7后&#xff0c;再使用时遇到一些问题&#xff0c;这里记录一下以备忘。 升级后&#xff0c;使用任何命令 不能用了&#xff0c;提示的意思大致是本地的workcopy版本太低了&#xff08;之前用1.6版本&#xff0c;check…

[JavaME]手机申请移动分配的动态IP(3)?

获取IP后是否可以和它通讯呢&#xff1f;<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />Hi&#xff0c;继续上回的讨论《[JavaME]手机是否能够申请到动态IP[2]?》。 上回说到申请动态IP是可以了&#xff0c;并且准备好了一个线…

第九十八期:TIOBE11月榜单:C、Swift、Go、D与Rust起起伏伏

TIOBE 指数并不代表语言的好坏&#xff0c;开发者可以使用该榜单检查自身的编程技能是否需要更新&#xff0c;或者在开始构建新软件时对某一语言做出选择。 作者&#xff1a;oschina TIOBE 公布了 11 月份编程语言排行榜。 本月前 20 名中有一些有趣的现象&#xff0c;先看看…

Vue 之 slot(插槽)

前言&#xff1a; vue中关于插槽的文档说明很短&#xff0c;语言又写的很凝练&#xff0c;再加上其和methods&#xff0c;data&#xff0c;computed等常用选项在使用频率、使用先后上的差别&#xff0c;这就有可能造成初次接触插槽的开发者容易产生“算了吧&#xff0c;回头再学…

第一百期:Java架构师:高并发下的流量控制

这个时候如果不做任何保护措施&#xff0c;服务器就会承受很大的处理压力&#xff0c;请求量很高&#xff0c;服务器负载也很高&#xff0c;并且当请求超过服务器承载极限的时候&#xff0c;系统就会崩溃&#xff0c;导致所有人都不能访问。 作者&#xff1a;IT技术分享 这个…

OpenCV学习笔记:矩阵的掩码操作

矩阵的掩码操作很简单。其思想是&#xff1a;根据掩码矩阵&#xff08;也称作核&#xff09;重新计算图像中每个像素的值。掩码矩阵中的值表示近邻像素值&#xff08;包括该像素自身的值&#xff09;对新像素值有多大影响。从数学观点看&#xff0c;我们用自己设置的权值&#…

spring mvc学习(15)Referenced file contains errors

SSM项目中出现Referenced file contains errors (http://www.springframework.org/schema/mvc/spring-mvc-3.0.xs 2019-01-20 22:37:06 薛定谔小猫Historia 阅读数 468更多 分类专栏&#xff1a; java及其框架学习 版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循…

spring mvc学习(16)Could not publish server configuration for Tomcat v8.0 Server at localhost.

这个问题本质是我们有多个重名项目&#xff0c;为什么我们会有多个重名项目&#xff0c;其实一般都是我们删除以前的项目&#xff0c;然后再把它重新导进eclipse时以前的项目删除不彻底造成的&#xff0c;以前的项目在"Servers"里面的"server.xml"文件下的…

产品管理:启示录 - 特约客户、产品验证、原型测试

• 如何挑选有潜力的产品&#xff1f; • 如何证明产品设计符合用户需求&#xff1f; • 如何确认产品设计满足三个基本条件&#xff1f; • 如何运用敏捷方法管理产品&#xff1f; • …… 这是《启示录》上说的一些话&#xff0c;去年看了一下&#xff0c;和团队分享了其中几…