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

这是索引二分的第二篇算法,力扣链接

这道题其实在另一个专栏写过,借此机会复习一下吧。

给你一个按照非递减顺序排列的整数数组 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]

暴力求解

遇事不决暴力题解,先来暴力求解这道题,无非是在一段有序数组内,找到目标值所存在的区间。

func searchRange(nums []int, target int) []int {l, r := -1, -1for i, num := range nums {if num > target {break}if num == target {if l == -1 {l = ir = i} else {r = i}}}return []int{l, r}
}

二分查找

但题目的复杂度是log n,不难想到是用二分法操作。

公式知识

说到二分法,不得不借机延伸的几种解法了。

二分法的初衷是在缩小的范围内从中间开始寻找目标值。对于这个缩小的范围又会有左闭右闭、左闭右开、左开右闭的区别。这几种做法没什么本质区别,熟练运用一个就行。

我最常用的二分法是左闭右闭的求解法:

func search(nums []int, target int) int {l, r := 0, len(nums)-1for l <= r {mid := l + (r-l)/2if nums[mid] < target {l = mid + 1} else {r = mid - 1}}if l == len(nums) || nums[l] != target {return -1}return l // 或者 r + 1
}

左闭右开解题思路:

func search(nums []int, target int) int {l, r := 0, len(nums)for l < r {mid := l + (r-l)/2if nums[mid] < target {l = mid + 1} else {r = mid}}if l == len(nums) || nums[l] != target {return -1}return l // 或者 r
}

左开右开解题思路:

func search(nums []int, target int) int {l, r := -1, len(nums)for l+1 < r {mid := l + (r-l)/2if nums[mid] < target {l = mid} else {r = mid}}if l+1 == len(nums) || nums[l+1] != target {return -1}return l+1
}
题解该题

关于这道题的第一个思路就是利用二分法找到一个值,上述的三种方法都是取的靠左的值,向右遍历求解即可:

func searchRange(nums []int, target int) []int {l, r := 0, len(nums)-1for l <= r {mid := l + (r-l)/2if nums[mid] < target {l = mid + 1} else {r = mid - 1}}if l == len(nums) || nums[l] != target {return []int{-1, -1}}r = lfor i := l + 1; i < len(nums); i++ {if nums[i] == target {r = i} else {break}}return []int{l, r}
}

第二个方法是找target+1,找到的值作为右边界:


func searchRange(nums []int, target int) []int {l := search(nums, target)if l == len(nums) || nums[l] != target {return []int{-1, -1}}r := search(nums, target+1) - 1return []int{l, r}
}func search(nums []int, target int) int {l, r := 0, len(nums)-1for l <= r {mid := l + (r-l)/2if nums[mid] < target {l = mid + 1} else {r = mid - 1}}return l
}

第三个方法就很神奇了, 左右边界不赋值mid,而是做++/--的操作:

func searchRange(nums []int, target int) []int {left, right := 0, len(nums)-1for left <= right {if nums[left] == target && nums[right] == target {return []int{left, right}}if nums[left] != target {left++}if nums[right] != target {right--}}return []int{-1, -1}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/198394.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

指针进阶知识超详细讲解(C语言)(中)

前言 苦苦等待&#xff0c;终于迎来了我们的指针讲解第二期&#xff0c;如果有还没有看过上一期的小伙伴&#xff0c;那赶紧点击这个链接学习后再来看这篇博客吧。指针基础知识超详细讲解&#xff08;C 语言&#xff09;&#xff08;上&#xff09; 如果对学习C语言有兴趣那千万…

超热门好用的免费API接口汇总

通用文字识别OCR&#xff1a;多场景、多语种、高精度的整图文字检测和识别服务&#xff0c;多项指标行业领先&#xff0c;可识别中、英、日、韩、法、德多种语言。二维码识别OCR&#xff1a;对图片中的二维码、条形码进行检测和识别&#xff0c;返回存储的文字内容。身份证识别…

如何在Linux环境搭建本地SVN服务器并结合cpolar实现公网访问

目录 前言 1. Ubuntu安装SVN服务 2. 修改配置文件 2.1 修改svnserve.conf文件 2.2 修改passwd文件 2.3 修改authz文件 3. 启动svn服务 4. 内网穿透 4.1 安装cpolar内网穿透 4.2 创建隧道映射本地端口 5. 测试公网访问 6. 配置固定公网TCP端口地址 6.1 保留一个固定…

GEE:Sobel算子卷积

作者&#xff1a;CSDN _养乐多_ 本文将深入探讨边缘检测中的一个经典算法&#xff0c;即Sobel算子卷积。我们将介绍该算法的基本原理&#xff0c;并演示如何在Google Earth Engine中应用Sobel算子进行图像卷积操作。并以试验区NDVI为例子&#xff0c;研究区真彩色影像、NDVI图…

【GIT】.gitignore 在忽略目录中放开某目录

示例&#xff1a;忽略build下面的所有目录&#xff0c;只放开build/ast2500-default/workspace/recipes-phosphor/ 目录 .gitignore 实现文件代码 # 忽略 build 目录下的所有目录 # 并放开build/ast2500-default/workspace/recipes-phosphor/ build/* !build/ast2500-defaul…

记录 | c++打印变量类型

c打印变量类型: 使用 typeid(变量名).name() int main(){std::cout << "type of ss : " << typeid(ss).name() << std::endl; }

轮询分区的设置

终于可以写MPI了&#xff0c;没想到&#xff0c;刚开始就当头一棒&#xff0c;我按照之前的配置MPI环境&#xff0c;配置完成就报错 好家伙&#xff0c;仔细检查了每一个步骤都没找到问题&#xff0c;上网搜索了一些解决方案&#xff0c;也没有解决。所幸&#xff0c;在配置MPI…

关于前端学习的思考-vertical-align的用法

先摆结论&#xff1a;vertical-align这里的top线&#xff0c;bottom线&#xff0c;middle线&#xff0c;baseline线是由最大宽度和最大高度的行内元素或行内块元素决定的。 按照惯例&#xff0c;先摆三个行内元素。 1、改变第一个盒子&#xff0c;vertical-align&#xff1a;to…

主机装ubuntu双系统,无线网络问题

微星主板开机按del进入bios&#xff0c;setting里设置启动优先级 启动盘制作 350G 三个分区&#xff1a; 1.EFI系统分区&#xff0c;2G&#xff0c;逻辑分区&#xff0c;空间起始位置 2.Ext4&#xff0c;/&#xff0c;根目录&#xff0c;120G&#xff0c;主分区&#xff0c…

Java异常详解大全(2023版)

Java异常详解 异常分类1.Throwable2. Error(错误)3. Exception(异常)3.1 运行时异常 RuntimeException3.2 编译时异常(受检查异常)ClassNotFoundException + IOException4.常见的运行时异常5.异常如何处理Java 的异常处理是通过 5 个关键词来实现的:try、catch、throw、…

Uber Go 语言编码规范

uber-go/guide 的中文翻译 English 文档链接 Uber Go 语言编码规范 Uber 是一家美国硅谷的科技公司&#xff0c;也是 Go 语言的早期 adopter。其开源了很多 golang 项目&#xff0c;诸如被 Gopher 圈熟知的 zap、jaeger 等。2018 年年末 Uber 将内部的 Go 风格规范 开源到 G…

人工智能学习6(贝叶斯实现简单的评论情感分析)

编译工具PyCharm 文章目录 编译工具PyCharm 文本分析与表示实现方式&#xff1a;文本表示方法文本相似度计算LDA主题模型 朴素贝叶斯算法应用&#xff1a;评论情感分析&#xff0c;工具评论分析是好评还是差评获取数据加载停用词内容标准化&#xff08;将每一句话划分成一个个的…

四通道轨-轨运算芯片 D8054,外围应用简便,低功耗2.3mA (典型值)运放供电电流

D8054是一款四通道轨-轨运算放大器&#xff0c;外围应用简便&#xff0c;价格低廉。封装形式为SOP14&#xff0c;TSSOP14&#xff0c; SOP16&#xff0c; TSSOP16。 主要特点&#xff1a; ● 轨-轨输出&#xff0c;输出失调2mV (典型值) ● 高速250MHz&#xff0c;-3dB带…

HNU-电路与电子学-2018期末A卷(含标准解析)

【写在前面】 电路与电子学好像是从2020级开设的课程&#xff0c;故实际上目前只有2020与2021两个年级考过期末考试。 这门课程主要由所谓的“数电”与“模电”组成。而且先学的“模电”后学的“”数电&#xff0c;故期中考试主要以“模电”为主&#xff0c;期末考试主要以“数…

“上云”还是“下云”?探云计算的下一站未来!

引言 10 月 27 日&#xff0c;X&#xff08;原Twitter&#xff09;工程技术发布帖子称&#xff0c;在过去的一年里&#xff0c;技术团队优化了 X 的云服务使用方式&#xff0c;着手将更多工作负载迁往本地基础设施。这一转变使 X 每月的云成本降低了 60%。所有媒体、Blob 存储均…

[全志]更新bootlogo分区数据从而更新bootlogo

一、需求 在不进行镜像烧录的情况下&#xff0c;通过启动项或脚本将已存在于主板的bootlogo文件更新到bootlogo分区中&#xff0c;从而实现bootlogo的更新 二、操作 1、在主板上查找bootlogo文件路径 find -name bootlogo* 实机效果&#xff1a; 2、进入文件夹路径 cd ./d…

视频剪辑方法:AI智剪高效稳定,视频批量处理有技巧

随着社交媒体的兴起和视频制作工具的普及&#xff0c;视频剪辑已经成为一项重要的工作。然而对于许多非专业创作者来说&#xff0c;视频剪辑可能是一项困难的任务。所幸AI智剪提供了一种高效稳定的视频剪辑方法&#xff0c;使得视频批量处理变得更加简单。使用AI智剪可以大大节…

jQuerylayui

$(document).ready(function(){ // 开始写 jQuery 代码... }); 这是为了防止文档在完全加载&#xff08;就绪&#xff09;之前运行 jQuery 代码&#xff0c;即在 DOM 加载完成后才可以对 DOM 进行操作。 jquery选择器 选择器有三种 $("p")元素选择器 $("#te…

派对的最大快乐值

与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 派对的最大快乐值 &#x1f48e;总结 派对的最大快乐值 题目 员工信息的定义如下&#xff1a; 公司的每个员工都符合 Employee 类的描述。整个公司的人员结构可以看作是一棵标准的、没有环的多叉树。树的头节点是公…

蓝桥杯物联网竞赛_STM32L071_10_温度传感器扩展模块

原理图&#xff1a; 温度传感器原理图&#xff1a; 其中芯片可以通过SCL和SDA引脚通过I2C通信向温度传感器指定地址获取温度的模拟量 再利用公式将模拟量转换成相应温度即可 实验板接口原理图&#xff1a; 模拟量转相应温度公式&#xff1a; CubMx配置&#xff1a; Keil配置&…