搜索插入位置(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之二分查找的更多相关文章

  1. jvascript 顺序查找和二分查找法

    第一种:顺序查找法 中心思想:和数组中的值逐个比对! /* * 参数说明: * array:传入数组 * findVal:传入需要查找的数 */ function Orderseach(array,f ...

  2. Java实现的二分查找算法

    二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小 于该中点 ...

  3. 从一个NOI题目再学习二分查找。

    二分法的基本思路是对一个有序序列(递增递减都可以)查找时,测试一个中间下标处的值,若值比期待值小,则在更大的一侧进行查找(反之亦然),查找时再次二分.这比顺序访问要少很多访问量,效率很高. 设:low ...

  4. java实现二分查找

    /** * 二分查找 * @param a * @param n * @param value * @return * @date 2016-10-8 * @author shaobn */ publ ...

  5. 最新IP地址数据库 二分逼近&二分查找 高效解析800万大数据之区域分布

    最新IP地址数据库  来自 qqzeng.com 利用二分逼近法(bisection method) ,每秒300多万, 比较高效! 原来的顺序查找算法 效率比较低 readonly string i ...

  6. c#-二分查找-算法

    折半搜索,也称二分查找算法.二分搜索,是一种在有序数组中查找某一特定元素的搜索算法. A 搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束: B 如果某一特定元素大于或者小 ...

  7. 【Python】二分查找算法

    二分查找:在一段数字内,找到中间值,判断要找的值和中间值大小的比较.如果中间值大一些,则在中间值的左侧区域继续按照上述方式查找.如果中间值小一些,则在中间值的右侧区域继续按照上述方式查找.直到找到我们 ...

  8. PHP实现文本快速查找 - 二分查找

    PHP实现文本快速查找 - 二分查找法 起因 先说说事情的起因,最近在分析数据时经常遇到一种场景,代码需要频繁的读某一张数据库的表,比如根据地区ID获取地区名称.根据网站分类ID获取分类名称.根据关键 ...

  9. java二分查找举例讨论

    最近做笔试题有这么一个关于二分查找的例子. 给一个有序数组,和一个查找目标,用二分查找找出目标所在index,如果不存在,则返回-1-(其应该出现的位置),比如在0,6,9,15,18中找15,返回3 ...

  10. JAVA源码走读(二)二分查找与Arrays类

    给数组赋值:通过fill方法. 对数组排序:通过sort方法,按升序.比较数组:通过equals方法比较数组中元素值是否相等.查找数组元素:通过binarySearch方法能对排序好的数组进行二分查找 ...

随机推荐

  1. APEX实战第2篇:构建自己第一个APEX程序

    为了尽快实现从0到1的突破,第一个程序就选择一个最简单易懂的生活场景. 后续随着APEX学习过程不断迭代增强这个程序. 现在就开始吧,我给孩子看一些公开网络课时,习惯把课程资源做分片,然后有计划的让孩 ...

  2. osmts:OERV之一站式管理测试脚本

      最近团队里面实习的小伙伴开发了一个新的项目,可以用来一键式运行各种测试脚本并且完成数据总结,我也尝试部署了一下,遇到了一些问题,接下来一起解析一下这个项目.   首先是获取osmts git cl ...

  3. OpenAI的GPT-4o:普通人的AI秘书来了

    1. 惊艳时刻:AI比你想象的更"人性" 早餐时,张三正埋头刷推送,一篇关于OpenAI发布GPT-4o的文章瞬间点燃了他的好奇心.这个AI简直是科技圈的惊雷!竟然可以像真人一样说 ...

  4. 元模型对AI的哲学意义:让机器真正"懂"世界

    元模型对AI的哲学意义:让机器真正"懂"世界 (用日常语言和比喻解释) 1. 传统AI像"死记硬背的学生" 问题:现在的ChatGPT就像背了无数词典的人,能对 ...

  5. 适配器设计模式--java进阶day03

    1.设计模式 通俗来讲,设计模式就是其他程序员遇到某些问题时的解决经验,我们学习设计模式,在遇到了同样的问题后便可解决 2.适配器设计模式 有人可能会感到疑惑,接口和实现类会有什么问题,我们举两个例子 ...

  6. Golang高性能引擎:ZKmall开源商城支撑百万级日活交易流畅运行

    在电商业务高并发.低延迟的严苛场景下,技术栈的选择直接决定系统上限.ZKmall开源商城基于Golang技术生态,以协程级并发.毫秒级响应为核心优势,为百万级日活电商平台提供高性能解决方案.本文从架构 ...

  7. Maven导包报错Could not resolve dependencies for projectXXX was cached in the local repository....

    问题 将项目和maven仓库一起拿到了内网环境,一直报错无法解析依赖was cached in the local repository, resolution will not be reattem ...

  8. Sa-Token v1.42.0 发布 🚀,新增 API Key、TOTP 验证码、RefreshToken 反查等能力

    Sa-Token 是一款 免费.开源 的轻量级 Java 权限认证框架,主要解决:登录认证.权限认证.单点登录.OAuth2.0.微服务网关鉴权 等一系列权限相关问题. 目前最新版本 v1.42.0 ...

  9. 100行代码实现Chat2XX(DB/ Web/ KnowledgeBase)

    这两年基于大模型的应用可谓五花八门,Chat2DB,Chat2Web,Chat2KnowledgeBase,Chat2XXX等等.本质上都是以自然语言作为系统输入,通过各种手段获取额外的上下文信息,然 ...

  10. Vue横向滚动鼠标控制

    let level_cards // 标记可移动 , move_start // 移动初始的x位置 , move_x // 移动初始的容器偏移量 , move_scroll_left // 判断是否为 ...