hot100之二分查找
搜索插入位置(035)
class Solution {
public int searchInsert(int[] nums, int target) {
int n = nums.length;
int lef = -1;
int rig = n;
while(lef+1 < rig){
int mid = (lef + rig) / 2;
if (nums[mid] < target){
lef = mid;
}else rig = mid;
}
return rig;
}
}
- 分析
基础二分
搜索二维矩阵(074)
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int m = matrix.length;
int n = matrix[0].length;
int lef = -1;
int rig = m*n;
while (lef+1 < rig){
int mid = (lef + rig) / 2;
int x = matrix[mid/n][mid%n];
if (x < target) lef = mid;
else if (x > target) rig = mid;
else return true;
}
return false;
}
}
- 分析
把每一个row 横向相连, 作二分
在排序数组中查找元素的第一个和最后一个位置(034)
class Solution {
public int[] searchRange(int[] nums, int target) {
int start = searchLower(-1 ,nums, target);
if (start == nums.length || nums[start] != target) return new int[]{-1,-1};
int end = searchLower(start, nums, target+1) -1;
return new int[] {start, end};
}
private int searchLower(int lef, int[] nums, int target){
int rig = nums.length;
while (lef + 1 < rig){
int mid = (lef + rig) / 2;
if (nums[mid] < target) lef = mid;
else rig = mid;
}
return rig;
}
}
- 分析
通过两次二分 查找 target 和target+1的起始位置, 确定target的范围
搜索旋转排序数组(033)
class Solution {
public int search(int[] nums, int target) {
int n = nums.length -1;
int lef = -1;
int rig = n;
while (lef + 1< rig){
int mid = (lef + rig) / 2;
if (check(nums, target, mid)){ //target在mid右侧
lef = mid;
}else rig = mid;
}
return nums[rig] == target ? rig : -1;
}
private boolean check(int[] nums, int target, int idx){
int x = nums[idx];
int end = nums[nums.length-1];
if (x < end){
return x < target && target <= end; // mid在小端 且比target小
}
// mid在大端 且< target在小端 || target > mid >
return x < target || target <= end;
}
}
- 分析
通过mid和end值的对比, 确定mid的位置<旋转小端, 旋转大端>
根据 mid的位置再分类讨论
寻找旋转排序数组的最小值(153)
class Solution {
public int findMin(int[] nums) {
int n = nums.length;
int lef = -1;
int rig = n;
while (lef+1 < rig){
int mid = (lef + rig) / 2;
if(nums[mid] > nums[n-1]){ // 在右侧
lef = mid;
}else rig = mid;
}
return nums[rig];
}
}
- 分析
判断 mid 在<大端, 小端> →<右移, 左移>
- 感悟
二分用来查找数据的拐点, 以<条件>作check()
寻找两个正序数组的中位数(004)
这题给我写晕厥了
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
if (nums1.length > nums2.length){
return findMedianSortedArrays(nums2, nums1);
}
int m = nums1.length;
int n = nums2.length;
int lef = -1;
int rig = m;
while (lef+1 < rig){
int mid_nums1 = (lef+rig) / 2;
int mid_nums2 = (m+n+1) / 2 - (mid_nums1+1) -1;
if(nums1[mid_nums1] - nums2[mid_nums2+1] <= 0){
lef = mid_nums1;
}else rig = mid_nums1;
}
int idx_nums1 = lef;
int idx_nums2 = (m+n+1)/2 - (lef+1) - 1;
int lef_max_nums1 = idx_nums1 >= 0 ? nums1[idx_nums1] : Integer.MIN_VALUE;
int lef_max_nums2 = idx_nums2 >= 0 ? nums2[idx_nums2] : Integer.MIN_VALUE;
int rig_min_nums1 = idx_nums1 + 1 < m ? nums1[idx_nums1+1] : Integer.MAX_VALUE;
int rig_min_nums2 = idx_nums2 + 1 < n ? nums2[idx_nums2+1] : Integer.MAX_VALUE;
int max = Math.max(lef_max_nums1, lef_max_nums2);
int min = Math.min(rig_min_nums1, rig_min_nums2);
return (m+n)%2 != 0 ? max : (max+min) / 2.0;
}
}
- 分析
我们取两数组<红>作为总数据集<中位数左侧>的小端, <蓝>作为总数据集<中位数右侧>的大端

接下来我们通过二分找拐点if(nums1[mid_nums1] - nums2[mid_nums2+1] <= 0)
如果从<红>中取<蓝>对<红>产生正反馈(变大) 取 rig = mid
产生负反馈(变小或不变) 取 lef = mid
hot100之二分查找的更多相关文章
- jvascript 顺序查找和二分查找法
第一种:顺序查找法 中心思想:和数组中的值逐个比对! /* * 参数说明: * array:传入数组 * findVal:传入需要查找的数 */ function Orderseach(array,f ...
- Java实现的二分查找算法
二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小 于该中点 ...
- 从一个NOI题目再学习二分查找。
二分法的基本思路是对一个有序序列(递增递减都可以)查找时,测试一个中间下标处的值,若值比期待值小,则在更大的一侧进行查找(反之亦然),查找时再次二分.这比顺序访问要少很多访问量,效率很高. 设:low ...
- java实现二分查找
/** * 二分查找 * @param a * @param n * @param value * @return * @date 2016-10-8 * @author shaobn */ publ ...
- 最新IP地址数据库 二分逼近&二分查找 高效解析800万大数据之区域分布
最新IP地址数据库 来自 qqzeng.com 利用二分逼近法(bisection method) ,每秒300多万, 比较高效! 原来的顺序查找算法 效率比较低 readonly string i ...
- c#-二分查找-算法
折半搜索,也称二分查找算法.二分搜索,是一种在有序数组中查找某一特定元素的搜索算法. A 搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束: B 如果某一特定元素大于或者小 ...
- 【Python】二分查找算法
二分查找:在一段数字内,找到中间值,判断要找的值和中间值大小的比较.如果中间值大一些,则在中间值的左侧区域继续按照上述方式查找.如果中间值小一些,则在中间值的右侧区域继续按照上述方式查找.直到找到我们 ...
- PHP实现文本快速查找 - 二分查找
PHP实现文本快速查找 - 二分查找法 起因 先说说事情的起因,最近在分析数据时经常遇到一种场景,代码需要频繁的读某一张数据库的表,比如根据地区ID获取地区名称.根据网站分类ID获取分类名称.根据关键 ...
- java二分查找举例讨论
最近做笔试题有这么一个关于二分查找的例子. 给一个有序数组,和一个查找目标,用二分查找找出目标所在index,如果不存在,则返回-1-(其应该出现的位置),比如在0,6,9,15,18中找15,返回3 ...
- JAVA源码走读(二)二分查找与Arrays类
给数组赋值:通过fill方法. 对数组排序:通过sort方法,按升序.比较数组:通过equals方法比较数组中元素值是否相等.查找数组元素:通过binarySearch方法能对排序好的数组进行二分查找 ...
随机推荐
- Draw.io:你可能不知道的「白嫖级」图表绘制神器
介绍 draw.io 是一个在 GitHub 上开源且拥有近十年发展历史的成熟项目,它是一款用于绘制 UML 图表的工具. 如果你曾经为流程图的绘制而流泪,又或是在夜里和UML大战到失眠, 不妨试试它 ...
- Opencv环境配置一览
OpenCV环境配置一览 专业相关,平时经常会使用到opencv的一些函数,目前主要包括Ubuntu系统,Android系统,本篇文章介绍在两个系统下对应的环境配置策略. Ubuntu环境 附上一个很 ...
- DeepSeek 聊天机器人项目
想要更深入玩转聊天机器人开发? 推荐本文档 + 课程<DeepSeek 聊天机器人项目>一起学习,效果翻倍! 边学边练,轻松打造智能对话系统~ (๑•̀ㅂ•́)و✧ 快上车,AI 之旅发车 ...
- BotSharp + MCP 三步实现智能体开发
1. 简介 1.1 什么是MCP Model Context Protocol(MCP)模型上下文协议是一种标准化协议,它让大模型能够更容易地和外部的数据.工具连接起来.你可以把MCP想象成一个通用的 ...
- 应用引入LLM实践
LLM最近在各行各业遍地开花,产生了很好的效果,也落地了很多好的功能应用. 无论是从实际应用角度,还是从营销角度,我们都需要接入大模型能力. 拿国内比较火的Deepseek来说,具有良好的推理能力,可 ...
- 垂直模型和AI Workflow是开AGI的历史倒车
提供AI咨询+AI项目陪跑服务,有需要回复1 RL 之父 Rich Sutton在 2019 年的文章<苦涩的教训>中指出: 70 年的 AI 研究历史告诉我们一个最重要的道理:依靠纯粹算 ...
- 解决React Warning: Function components cannot be given refs. Attempts to access this ref will fail. Did you mean to use React.forwardRef()?
问题 当我使用如下方式调用组件子组件UploadModal并且绑定Ref时React报错"Warning: Function components cannot be given refs. ...
- 等保2.0>Windows下实现MySQL数据库自动备份
说明: MySQL数据库安装目录:C:\Program Files\mysql-5.7.37-winx64\mysql-5.7.37-winx64 MySQL数据库存放目录:C:\Program Fi ...
- VMware 17 Pro 虚拟机从下载到安装的超详细教程,解决你的所有疑问
VMware 17 Pro介绍 VMware 17 Pro是一款功能强大的虚拟机软件,适用于开发人员.测试人员.系统管理员和教育机构.它可以在一台计算机上模拟运行多台虚拟机,支持Windows.Lin ...
- K8s新手系列之Label标签和Label选择器
概述 官网:https://kubernetes.io/zh-cn/docs/concepts/overview/working-with-objects/labels/ 在K8s中,Label(标签 ...