二分查找----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.mfbz.cn/a/2643.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

修改 Lucide-React 图标样式的方法

修改 Lucide-React 图标样式的方法 使用 lucide-react 时&#xff0c;你可以通过多种方式修改图标的样式。以下是几种常用的方法&#xff1a; 1. 通过 className 属性 import { Home } from lucide-react;function MyComponent() {return <Home className"text-blue-50…

新手向:Idea的使用技巧

为什么选择IntelliJ IDEA作为Java开发工具&#xff1f; IntelliJ IDEA被誉为Java开发者的"智能助手"&#xff0c;它就像手机里的Siri或小爱同学一样&#xff0c;能够智能地辅助开发者完成各种编程任务。 具体来说&#xff0c;IDEA具有以下突出优势&#xff1a; 智…

自动化运维:从脚本到DevOps的演进

自动化通常从编写脚本开始&#xff0c;这些脚本可以自动执行常规任务&#xff0c;如备份数据、更新软件或监控系统性能。例如&#xff0c;一个简单的Bash脚本可以定期检查磁盘空间并清理临时文件&#xff1a;#!/bin/bash # Disk Cleanup Script threshold80 # Set threshold…

Python机器学习:从零基础到项目实战

目录第一部分&#xff1a;思想与基石——万法归宗&#xff0c;筑基问道第1章&#xff1a;初探智慧之境——机器学习世界观1.1 何为学习&#xff1f;从人类学习到机器智能1.2 机器学习的“前世今生”&#xff1a;一部思想与技术的演进史1.3 为何是Python&#xff1f;——数据科学…

【kubernetes】-2 K8S的资源管理

文章目录K8S的资源管理1、资源管理方式简介1.1 陈述式管理资源的方法1.2 kubernetes 集群资源管理入口2、kubectl 常用命令2.1 集群操作2.2 资源操作2.3 项目生命周期管理2.3.1 创建2.3.2 发布2.3.3 更新2.3.4 回滚2.3.5删除3、图解服务发布阶段 1&#xff1a;外部客户端 → 节…

AWS PrivateLink方式访问Redis

问题 现在有两个不同的aws云账号&#xff0c;而且&#xff0c;这两个不同云账号&#xff0c;其中一个拥有Redis服务&#xff08;elasticache&#xff09;。现在需要通过另外一个账号的vpc内网访问另外一个账号的内网的redis服务。 解决 AWS PrivateLink方式。这样就可以通过…

数据库—修改某字段默认值

前言有时候&#xff0c;数据库的字段默认值没有正确设置&#xff0c;这时候需要改默认值。以下是我做的改默认值的记录&#xff0c;希望对网友有所帮助。1.SQL SERVER下面的示例假设你要修改名为 YourColumnName 的字段&#xff0c;并为其设置一个新的默认值 NewDefaultValue。…

Go语言切片(Slice)与数组(Array)深度解析:避坑指南与最佳实践

在Go语言中&#xff0c;切片(slice)和数组(array)是两种基础但常被混淆的数据结构。本文将深入剖析它们的核心区别&#xff0c;揭示常见陷阱&#xff0c;并提供实战解决方案。一、本质区别&#xff1a;固定大小 vs 动态容器 数组(Array)&#xff1a;固定长度的连续内存块 // 声…

2025乐彩V8影视系统技术解析:双端原生架构与双H5免签封装实战 双端原生+双H5免签封装+TV级性能优化,一套代码打通全终端生态

1. 双端原生实现方案 Android端&#xff1a;基于Kotlin Jetpack Compose架构&#xff0c;深度优化ExoPlayer内核&#xff0c;支持4K HDR硬解与DRM加密流 iOS端&#xff1a;Swift SwiftUI构建&#xff0c;集成AVFoundation定制播放器&#xff0c;实现画中画与杜比全景声支持 …

【Dij】P1807 最长路

题意 设 GGG 为有 nnn 个顶点的带权有向无环图&#xff0c;GGG 中各顶点的编号为 111 到 nnn&#xff0c;请设计算法&#xff0c;计算图 GGG 中 1,n1, n1,n 间的最长路径。 输入格式 输入的第一行有两个整数&#xff0c;分别代表图的点数 nnn 和边数 mmm。 第 222 到第 (m1…

【数据结构初阶】--双向链表(二)

&#x1f525;个人主页&#xff1a;草莓熊Lotso &#x1f3ac;作者简介&#xff1a;C研发方向学习者 &#x1f4d6;个人专栏&#xff1a; 《C语言》 《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》 ⭐️人生格言&#xff1a;生活是默默的坚持&#xff0c;毅力是永久的…

一个月掌握数据结构与算法:高效学习计划

一个月掌握数据结构与算法&#xff1a;高效学习计划掌握数据结构与算法是成为优秀程序员的关键一步。虽然一个月时间紧凑&#xff0c;但通过高效学习完全可以掌握核心内容。以下是一个系统化的学习计划&#xff1a;第一周&#xff1a;基础数据结构目标&#xff1a;掌握数组、链…