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

二分查找----3.在排序数组中查找元素的第一个和最后一个位置

 

题目链接

/**

        在一个近似递增的数组中查找指定元素,该元素可能有多个找出其出现的区间

        单次普通二分只能查到一个元素且无法确定边界;对二分改进即可

        左边界:当查到目标元素时,记录下标并将right迭代为mid-1,继续向左二分直到搜寻结束,得到左边界

        右边界:当查到目标元素时,记录下标并将left迭代为mid+1,继续向右二分直到搜寻结束,得到右边界

        即进行两次改进二分,查找左边界与右边界

        优化:

            查找左边界与右边界大量代码相同,仅left与right指针迭代逻辑不同

            添加变量boolean isLeft,控制查找方向,一个方法即可完成左、右边界的查找

*/

class Solution {/**在一个近似递增的数组中查找指定元素,该元素可能有多个找出其出现的区间单次普通二分只能查到一个元素且无法确定边界;对二分改进即可左边界:当查到目标元素时,记录下标并将right迭代为mid-1,继续向左二分直到搜寻结束,得到左边界右边界:当查到目标元素时,记录下标并将left迭代为mid+1,继续向右二分直到搜寻结束,得到右边界即进行两次改进二分,查找左边界与右边界优化:查找左边界与右边界大量代码相同,仅left与right指针迭代逻辑不同添加变量boolean isLeft,控制查找方向,一个方法即可完成左、右边界的查找*/public int[] searchRange(int[] nums, int target) {//搜寻左边界int left = findBound(nums, target, true);if(left == -1) { //若为-1代表不存在该元素,无需继续搜寻return new int[]{-1,-1};}//搜寻右边界int right = findBound(nums, target, false);return new int[]{left, right};}private int findBound(int[] nums, int target, boolean isLeft) {//双指针,置于有效部分两端int left = 0, right = nums.length - 1;//不断迭代,记录已探明的边界int index = -1;while(left <= right) {//均分数组,缩小查找范围int mid = left + right >>> 1;//目标值在右半区,淘汰左半区if(nums[mid] < target) {left = mid + 1;}//目标值在左半区,淘汰右半区else if(nums[mid] > target) {right = mid - 1;}//查找到元素,迭代index,并依据findLeft确定查找方向else {index = mid;if(isLeft) { //向左继续二分,迭代rightright = mid - 1;} else { //向右二分,迭代leftleft = mid + 1;}}}return index;}
}

http://www.dtcms.com/a/295143.html

相关文章:

  • 语音增强相关技术
  • 【世纪龙科技】新能源汽车维护与故障诊断-汽车专业数字课程资源
  • 第八讲:C++中的vector
  • Ⅹ—6.计算机二级综合题5---6套
  • Fast Frequency Estimation Algorithm by Least Squares Phase Unwrapping
  • OpenLayers 快速入门(三)Source 对象补充
  • 车载绝缘子放电状态检测系统数据分析软件需求说明书
  • android15 wifi信号格数DB值对应关系及wifi回连时间
  • Python3常见接口函数
  • 详解FreeRTOS开发过程(四)-- 任务切换
  • 进程间通信之-----零拷贝
  • 【已解决】Jetson Orin NX apt更换国内源
  • 网络基础DAY18-动态路由协议基础
  • 零增益扰动!纯相位旋转:二阶全通滤波器实现精准超前矫正
  • 压测软件JMeter安装配置以及创建桌面快捷方式(详细图解)
  • 【每日算法】专题十八_BFS 解决拓扑排序
  • 前端开发性能监控详解
  • OpenCV(02)图像颜色处理,灰度化,二值化,仿射变换
  • 高可用架构模式——如何设计计算高可用架构
  • 前端学习日记(十一)
  • Spark 之 DataFrame
  • Android模块化实现方案深度分析
  • 深度学习的Logits:logist 是什么,上一维度的隐藏向量怎么获取
  • Linux C: 函数
  • 洪水预报中的序列到序列模型及其可解释性扩展
  • 设置低秩适配器(LoRA)
  • 优化:Toc小程序猜你喜欢功能
  • 基于python的微博评论和博文文本分析,包括LDA+聚类+词频分析+lstm热度预测,数据量10000条
  • 浅谈Python 中的 @contextmanager:资源管理与状态切换的最佳实践
  • 实验室信息管理系统的设计与实现/实验室管理系统