当前位置: 首页 > news >正文

【算法】二分查找(二)查找边界二分

目录

题目介绍

二段性

1.二段搜索

1.1搜索段端点

1.1.1住段的左端点

1.1.2住段的右端点

2.死循环

2.1中点偏向

2.2多余搜索

3.模板

3.1求段左端点:​编辑

3.2求段右端点:​编辑

4.区别

提交代码


题目介绍

34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

示例 1:

输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]

示例 2:

输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]

示例 3:

输入:nums = [], target = 0
输出:[-1,-1]

提示:

  • 0 <= nums.length <= 105
  • -109 <= nums[i] <= 109
  • nums 是一个非递减数组
  • -109 <= target <= 109

二段性

区域 可划分成 两段部分

1.二段搜索

两指针 在各段部分内 中点算 半缩排区域 地  往界点搜索

1.1搜索段端点

跃指针住指针相遇时 算排出 住段部分的端点

1.1.1住段的左端点

1.1.2住段的右端点


2.死循环

中点 下次立到 在住段部分的 住指针时,住指针的移动 去原地踏步后,再下次的中点也还不变 继续立住指针 去原地踏步,进入死循环

2.1中点偏向

  • left + (right - left) / 2偏左中点
  • left + (right - left + 1) / 2偏右中点

中点 不能 偏向 住段侧 立,否则 最后中点会立到住指针 而进入死循环

2.2多余搜索

跃指针与住指针相遇 算排得到结果后 就可停止搜索了,如果此时继续去搜索,left == right的中点 会立到住指针 而进入 原地踏步死循环


3.模板

3.1求段端点:

while(left < right) {

      int mid = left + (right - left) / 2; —> 立 偏左中点

      if(mid落左跃段) left = mid + 1;

      else right = mid; —> mid落右住段

}

3.2求段端点:

while(left < right) {

      int mid = left + (right - left + 1) / 2; —> 立 偏右中点

      if(mid落左住段) left = mid;

      else right = mid - 1; —> mid落右跃段

}

最上面 + 1,最下面 - 1


4.区别

朴素二分找值所在位置 边界二分找值范围边界


提交代码

public int[] searchRange(int[] nums, int target) {int[] ret = new int[2];ret[0] = ret[1] = -1;if(nums.length == 0) return ret;// 查找段端点,住段的左端点int left = 0, right = nums.length - 1;while(left < right) { // 不能去多余搜索 left == right时的情况,否则会 中点立到住指针 进入死循环int mid = left + (right - left) / 2; // 中点要偏向跃段部分 即偏左if(nums[mid] < target) left = mid + 1; // mid落左跃段else right = mid; // mid落右住段}if(nums[left] != target) return ret;else ret[0] = left;// 查找段端点,住段的右端点// left = 0; // 接下来左指针 可以直接从找到的左端点处开始 对剩下的右半部分 进行二分 查找右端点right = nums.length - 1;while(left < right) {int mid = left + (right - left + 1) / 2; // 中点不能偏向住段部分 即偏右if(nums[mid] <= target) left = mid; // mid落左住段else right = mid - 1; // mid落右跃段}ret[1] = left;return ret;
}
http://www.dtcms.com/a/460851.html

相关文章:

  • 【QT】采用fcitx5框架Ubuntu支持中文输入,QT不支持,解决?
  • 在Robosuite中如何使用Xbox游戏手柄操控mujoco仿真中的机械臂?
  • 数据民主化实践:ChatBI赋能全民数据分析
  • 零基础学AI大模型之LangChain链
  • 拱墅区网站建设网页培训机构
  • 潮州网站建设公司青岛市公共资源交易网
  • 告别重复数据烦恼!MySQL ON DUPLICATE KEY UPDATE 优雅解决存在更新/不存在插入难题
  • 开源项目安全性
  • 找网站建设都需要注意哪些云优化 网站建设
  • dockerfile构建案例
  • UiPath2025笔记第七节:B端Ai操控C端Rpa机器人
  • C++ 经典数组算法题解析与实现教程
  • 详解SOA架构,微服务架构,中台架构以及他们之间的区别和联系
  • 【C++学习笔记】伪随机数生成
  • Unity笔记(十二)——角色控制器、导航寻路系统
  • 关于嵌入式硬件需要了解的基础知识
  • 个人电脑做服务器网站目录型搜索引擎有哪些
  • 从赌场到AI:期望值如何用C++改变世界?
  • H3C网络设备 实验三: 搭建两个局域网,使两个局域网相互通信(路由器,自动分配ip,DHCP协议)
  • 【源码+文档+调试讲解】商品进销存管理系统SpringBoot016
  • 制造业中的多系统困境,如何通过iPaaS“破解”
  • CryptoJs 实现前端 Aes 加密
  • Dockerfile 应用案例-搭建Nginx镜像、部署扫雷、部署可道云平台
  • 文档抽取技术作为AI和自然语言处理的核心应用,正成为企业数字化转型的关键工具
  • MySQL 数据监控平台
  • 高并发内存池(七):大块内存的申请释放问题以及配合定长内存池脱离使用new
  • 可以为自己的小说建设网站企业官方网站格式
  • 学做静态网站商城设计app网站建设
  • 【Linux系统】线程安全与死锁问题
  • 分布式锁:Redisson的公平锁