leetcode——二分
(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——二分的更多相关文章
- leetcode二分查找问题整理
自从做完leetcode上的三道关于二分查找的题后,我觉得它是比链表找环还恶心的题,首先能写出bugfree代码的人就不多,而且可以有各种变形,适合面试的时候不断挑战面试者,一个程序猿写代码解决问题的 ...
- leetcode 二分查找
https://oj.leetcode.com/problems/search-for-a-range/就是一个二分查找,没事练练手 public class Solution { public in ...
- Leetcode: 二分搜索法
package com.LeetCode; /** * 算法:二分搜索法查找一个值,并返回索引值 * https://leetcode.com/problems/search-insert-posit ...
- 算法leetcode二分算法
二分算法通常用于有序序列中查找元素: 有序序列中是否存在满足某条件的元素: 有序序列中第一个满足某条件的元素的位置: 有序序列中最后一个满足某条件的元素的位置. 思路很简单,细节是魔鬼. 一.有序序列 ...
- [leetcode]二分查找总结
Search for a Range 1.最简单的想法,用最普通的二分查找,找到target,然后向左右扩张,大量的重复的target,就会出现O(n)效率. class Solution { pub ...
- leetcode 二分查找 Search in Rotated Sorted ArrayII
Search in Rotated Sorted Array II Total Accepted: 18500 Total Submissions: 59945My Submissions Follo ...
- Leetcode 二分查找 Search Insert Position
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie Search Insert Position Total Accepted: 14279 T ...
- leetcode 二分查找 Search in Rotated Sorted Array
Search in Rotated Sorted Array Total Accepted: 28132 Total Submissions: 98526My Submissions Suppose ...
- leetcode二分查找相关
目录 33/81搜索旋转排序数组 34在排序数组中查找元素的第一个和最后一个位置 35搜索插入位置 74搜索二维矩阵 300最长上升子序列,354俄罗斯套娃信封问题 33/81搜索旋转排序数组 假设按 ...
- 【Leetcode 二分】 滑动窗口中位数(480)
题目 中位数是有序序列最中间的那个数.如果序列的大小是偶数,则没有最中间的数:此时中位数是最中间的两个数的平均数. 例如: [2,3,4],中位数是 3 [2,3],中位数是 (2 + 3) / 2 ...
随机推荐
- 【RN - 基础】之React Native常见问题及解决方案
unable to load script from assets index.android.bundle... 问题原因: 找不到Android项目中的assets文件夹. 解决方案: 1.在An ...
- 【Android - 问题解决】之Android Studio在Refreshing Gradle Project卡住的问题
今天把Android Studio从2.2版本升级到了2.3版本,但是再打开以前项目的时候,就卡在 “Refreshing XXX Gradle Project” 这里不动了. 网上搜了一些解决方案, ...
- VS #region
1.C# 预处理指令 #region使您得以在使用Visual Studio代码编辑器的大纲显示功能时指定可展开或折叠的代码块. #region name 其中:name 希 ...
- DBCP2的使用例子和源码详解(不包括JNDI和JTA支持的使用)
目录 简介 使用例子 需求 工程环境 主要步骤 创建项目 引入依赖 编写jdbc.prperties 获取连接池和获取连接 编写测试类 配置文件详解 数据库连接参数 连接池数据基本参数 连接检查参数 ...
- 谈一谈个人利用Java的mysql的知识完成的数据库的项目-----用户信息管理系统
首先,我先简述一下自己做的过程啊,相信大家来找这样的博客,也都是为了完成自己课程任务吧.我也一样是一名大一的学生,是为了自己的课程任务而开始做数据库的项目的.因为还没学mysql吗,所以是自己找视频啊 ...
- 【开发者portal在线开发插件系列二】多条上下行消息(messageId的使用)【华为云技术分享】
前言和基本操作请参考[开发者portal在线开发插件系列一]profile和基本上下行消息,此处不再复述,没操作过的小伙伴一定要先去看看哦~ 话不多说,开始今天的演(表)示(演) 场景说明: 假设一: ...
- Nginx 404 Not Found 解决办法
环境:宝塔Nginx面板 解决办法: 宝塔面板--站点设置-配置文件. 去掉: error_page 404 /404.html; 前面的 # 号.
- [Mathematics][BJTU][Calculus]Detailed explanations and proofs of the Dirac-Abel Discriminant Methods which deal with the conditional convergence
So, today we will talk about the conditional convergence and two discriminant methods, namely Dirac- ...
- 谈架构设计中DDD思想的运用
首先,描述一下我的业务场景及项目分层结构,非标准DDD(其实我不觉得有标准),只是思考的时候有带入DDD思想. 业务场景:这是一个ERP系统对中台提供的接口项目,仓储操作大多都是存储过程去完成的. 项 ...
- java中List、Map、Set、Stack、Queue、Collections等的使用
java中List.Map.Set.Stack.Queue.Collections等的使用 List 创建方法: List<String> list=new ArrayList<&g ...