(1)4. 寻找两个有序数组的中位数(中)

https://leetcode-cn.com/problems/median-of-two-sorted-arrays/

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

思路:思路不是很难,但要注意很多边界情况,详情参考下面别人的注释:

    /*
* 1.首先,让我们在任一位置 i 将 A(长度为m) 划分成两个部分:
* leftA | rightA
* A[0],A[1],... A[i-1] | A[i],A[i+1],...A[m - 1]
*
* 由于A有m个元素,所以有m + 1中划分方式(i = 0 ~ m)
*
* 我们知道len(leftA) = i, len(rightA) = m - i;
* 注意:当i = 0时,leftA是空集,而当i = m时,rightA为空集。
*
* 2.采用同样的方式,将B也划分为两部分:
* leftB | rightB
* B[0],B[1],... B[j-1] | B[j],B[j+1],...B[n - 1]
* 我们知道len(leftA) = j, len(rightA) = n - j;
*
* 将leftA和leftB放入一个集合,将rightA和rightB放入一个集合。再把这两个集合分别命名为leftPart和rightPart。
*
* leftPart | rightPart
* A[0],A[1],... A[i-1] | A[i],A[i+1],...A[m - 1]
* B[0],B[1],... B[j-1] | B[j],B[j+1],...B[n - 1]
*
* 如果我们可以确认:
* 1.len(leftPart) = len(rightPart); =====> 该条件在m+n为奇数时,该推理不成立
* 2.max(leftPart) <= min(rightPart);
*
* median = (max(leftPart) + min(rightPart)) / 2; 目标结果
*
* 要确保这两个条件满足:
* 1.i + j = m - i + n - j(或m - i + n - j + 1) 如果n >= m。只需要使i = 0 ~ m,j = (m+n+1)/2-i =====> 该条件在m+n为奇数/偶数时,该推理都成立
* 2.B[j] >= A[i-1] 并且 A[i] >= B[j-1]
*
* 注意:
* 1.临界条件:i=0,j=0,i=m,j=n。需要考虑
* 2.为什么n >= m ? 由于0 <= i <= m且j = (m+n+1)/2-i,必须确保j不能为负数。
*
* 按照以下步骤进行二叉树搜索
* 1.设imin = 0,imax = m,然后开始在[imin,imax]中进行搜索
* 2.令i = (imin+imax) / 2, j = (m+n+1)/2-i
* 3.现在我们有len(leftPart) = len(rightPart)。而我们只会遇到三种情况:
*
* ①.B[j] >= A[i-1] 并且 A[i] >= B[j-1] 满足条件
* ②.B[j-1] > A[i]。此时应该把i增大。 即imin = i + 1;
* ③.A[i-1] > B[j]。此时应该把i减小。 即imax = i - 1;
*
* */

代码:

class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int m=nums1.length,n=nums2.length;
if(m>n){
int []tmp=nums1;nums1=nums2;nums2=tmp;
int t=m;m=n;n=t;
}
int l=0,r=m,i,midNum=(m+n+1)/2;
while(l<=r){
i=(l+r)>>1;
int j=midNum-i;
if(i-1>=0&&j<n&&nums1[i-1]>nums2[j]){
r=i-1;
}else if(j-1>=0&&i<m&&nums2[j-1]>nums1[i]){
l=i+1;
}else {
int mx,mn;
if(i==0){
mx=nums2[j-1];
}else if(j==0){
mx=nums1[i-1];
}else
mx=Math.max(nums1[i-1],nums2[j-1]);
if((m+n)%2==1)
return mx;
if(i==m){
mn=nums2[j];
}else if(j==n){
mn=nums1[i];
}else
mn=Math.min(nums1[i],nums2[j]);
return (mn+mx)*1.0/2;
}
}
return 0;
}
}

  

leetcode——二分的更多相关文章

  1. leetcode二分查找问题整理

    自从做完leetcode上的三道关于二分查找的题后,我觉得它是比链表找环还恶心的题,首先能写出bugfree代码的人就不多,而且可以有各种变形,适合面试的时候不断挑战面试者,一个程序猿写代码解决问题的 ...

  2. leetcode 二分查找

    https://oj.leetcode.com/problems/search-for-a-range/就是一个二分查找,没事练练手 public class Solution { public in ...

  3. Leetcode: 二分搜索法

    package com.LeetCode; /** * 算法:二分搜索法查找一个值,并返回索引值 * https://leetcode.com/problems/search-insert-posit ...

  4. 算法leetcode二分算法

    二分算法通常用于有序序列中查找元素: 有序序列中是否存在满足某条件的元素: 有序序列中第一个满足某条件的元素的位置: 有序序列中最后一个满足某条件的元素的位置. 思路很简单,细节是魔鬼. 一.有序序列 ...

  5. [leetcode]二分查找总结

    Search for a Range 1.最简单的想法,用最普通的二分查找,找到target,然后向左右扩张,大量的重复的target,就会出现O(n)效率. class Solution { pub ...

  6. leetcode 二分查找 Search in Rotated Sorted ArrayII

    Search in Rotated Sorted Array II Total Accepted: 18500 Total Submissions: 59945My Submissions Follo ...

  7. Leetcode 二分查找 Search Insert Position

    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie Search Insert Position Total Accepted: 14279 T ...

  8. leetcode 二分查找 Search in Rotated Sorted Array

    Search in Rotated Sorted Array Total Accepted: 28132 Total Submissions: 98526My Submissions Suppose ...

  9. leetcode二分查找相关

    目录 33/81搜索旋转排序数组 34在排序数组中查找元素的第一个和最后一个位置 35搜索插入位置 74搜索二维矩阵 300最长上升子序列,354俄罗斯套娃信封问题 33/81搜索旋转排序数组 假设按 ...

  10. 【Leetcode 二分】 滑动窗口中位数(480)

    题目 中位数是有序序列最中间的那个数.如果序列的大小是偶数,则没有最中间的数:此时中位数是最中间的两个数的平均数. 例如: [2,3,4],中位数是 3 [2,3],中位数是 (2 + 3) / 2 ...

随机推荐

  1. python网络爬虫之解析网页的正则表达式(爬取4k动漫图片)[三]

    前言 hello,大家好 本章可是一个重中之重,因为我们今天是要爬取一个图片而不是一个网页或是一个json 所以我们也就不用用到selenium模块了,当然有兴趣的同学也一样可以使用selenium去 ...

  2. CSS新特性之2D转换transform

    transform是css3中具有颠覆性特征之一,可以实现元素的位移.旋转.缩放等效果 1.位移translate 1.1语法 transform: translate(x,y);//x,y分别表示x ...

  3. HttpClient POST/SET方法

    前言: 网络API接口:https://api.apiopen.top/searchMusic 此API接口返回类型为JSON格式类型 GET:从指定资源请求数据 POST:向指定资源提交要被处理的数 ...

  4. Floyd && Dijkstra +邻接表 +链式前向星(真题讲解来源:城市路)

    1381:城市路(Dijkstra) 时间限制: 1000 ms         内存限制: 65536 KB提交数: 4066     通过数: 1163 [题目描述] 罗老师被邀请参加一个舞会,是 ...

  5. [ch04-03] 用神经网络解决线性回归问题

    系列博客,原文在笔者所维护的github上:https://aka.ms/beginnerAI, 点击star加星不要吝啬,星越多笔者越努力. 4.3 神经网络法 在梯度下降法中,我们简单讲述了一下神 ...

  6. MATLAB中cell函数用法

    cell元包是matlab中提供的一种数据类型,功能强大. 关于cell的创建: 1.跟一般创建举证一样,直接使用C = {A B D E}这种形式,不过这里把"[]"改成了}&q ...

  7. 8. SOFAJRaft源码分析— 如何实现日志复制的pipeline机制?

    前言 前几天和腾讯的大佬一起吃饭聊天,说起我对SOFAJRaft的理解,我自然以为我是很懂了的,但是大佬问起了我那SOFAJRaft集群之间的日志是怎么复制的? 我当时哑口无言,说不出是怎么实现的,所 ...

  8. 【云速建站】微信公众平台中维护IP白名单

    [摘要] 介绍获取接入IP白名单的操作步骤 网站后台对接微信公众号.支付等都依赖于白名单,接下来就介绍一下白名单的配置. 1.1      为什么要设置白名单 为了提高公众平台开发者接口调用的安全性, ...

  9. C语言I作业12-学期总结

    一.我学到的内容 二.我的收获 我完成的作业: 第一次作业 C语言I博客作业02 C语言I作业004 C语言I博客作业05 C语言I博客作业06 C语言I博客作业07 C语言I博客作业08 C语言I博 ...

  10. SX1276/SX1278和SXSX1262的详细参数对比

    SX1276/SX1278和SX1262的对比    SX1262是Semtech公司新推出的一款sub-GHz无线收发器.SX1262芯片最大的买点是它的低功耗和超远距离的传输.SX1262接收电流 ...