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

找出目标值在数组中的开始和结束位置(二分查找)

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

 方法一:


class Solution {
public:vector<int> searchRange(vector<int>& nums, int target) {vector<int> result = {-1, -1};int left = 0;int right = nums.size() - 1;while (left <= right) {  //二分查找算法的核心部分int mid = left + (right - left) / 2;if (nums[mid] < target) {left = mid + 1;} else {right = mid - 1;}}if (left < nums.size() && nums[left] == target) {result[0] = left;  //找到的话就把起始值记录为left} else {return result;    //到了数组结尾还没找到那就直接返回-1,-1}right = nums.size() - 1;    //重置 right 为数组的最后一个索引。while (left <= right) {    //第二次二分查找int mid = left + (right - left) / 2;if (nums[mid] <= target) {    //这里条件不一样需要注意left = mid + 1;} else {right = mid - 1;}}result[1] = right;    //更新终止值return result;}
};

 这道题可以使用二分查找的原因主要在于题目中的数组是非递减顺序排列的整数数组

vector<int> result = {-1, -1}; 

初始化一个整数向量 result,其初始值为 {-1, -1}

int mid = left + (right - left) / 2;

计算当前查找范围的中间索引 mid。这里采用的计算方式是为了避免可能的整数溢出。

if (nums[mid] < target)

如果 nums[mid] 小于 target,说明目标值位于 mid 的右侧,因此将 left 移动到 mid + 1,缩小查找范围。

如果 nums[mid] 大于或等于 target,则目标值位于 mid 的左侧(包括 mid 本身),所以将 right 移动到 mid - 1,缩小查找范围。

left < nums.size()

  • 这个条件确保 left 不会超出 nums 数组的范围。因为 left 在查找的过程中可能已经移动到了数组的末尾,如果 left 超过了数组的索引范围,直接访问 nums[left] 会导致运行时错误。

nums[left] == target

  • 这个条件检查 nums[left] 是否等于 target。如果 left 所指向的元素等于目标值,说明找到了目标值的起始位置。此时,将 result[0] 更新为 left,即目标值在数组中的起始索引。 

 如果 left 不在有效范围内,或者 nums[left] 不等于 target,这说明数组中不存在目标值。此时直接返回 result,它的值仍然是 [-1, -1],表示未找到目标值。

为什么两次二分查找的 if 语句不一样:

在第一次二分查找中,我们的目标是找到 target起始位置。如果存在起始值,当leftright 相遇时的相遇点即为起始值 target,这个时候需要保证 left 为 target,就需要right 左移来退出循环。

而在第二次二分查找中,我们的目标是找到 target结束位置。我们需要保证right 为 target,就需要 left右移来退出循坏。

二分查找的精髓通过每次比较中间值来逐步缩小查找范围,保证时间复杂度为 O(log⁡n)

 

方法二:

class Solution {
public:vector<int> searchRange(vector<int>& nums, int target) {int start = find(nums, target);int end = find(nums, target + 1) - 1;if (start == -1 || end < start) {return {-1, -1};}return {start, end};}int find(vector<int>& nums, int target) {int left = 0, right = nums.size() - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return left;}
};

利用 find(nums, target) 找到 target 的第一个位置,再利用 find(nums, target + 1) 找到比 target 大的第一个元素的位置,从而间接确定 target 的结束位置。

如果数组中不存在第一个大于 target 的元素,那么 find(nums, target + 1) 的结果将会是 nums.size(),end的值为 nums.size() - 1

假设 nums = [5, 7, 7, 8, 8, 10]target = 8

  • find(nums, 8) 返回 3,因为 8 的第一个位置在索引 3
  • find(nums, 9) 返回 5,因为 98 大,且索引 5 是第一个大于 8 的位置。
  • end = find(nums, 9) - 1 等于 4,所以返回 [3, 4]

 

相关文章:

找出目标值在数组中的开始和结束位置(二分查找)

给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&#xff0c;返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 示例 1&#xff1a…...

VSCode进阶之路

VSCode进阶之路&#xff1a;从入门到高效率开发 &#x1f680; Hey&#xff0c;朋友们好&#xff01;还在为VSCode的海量功能感到眼花缭乱吗&#xff1f;咱们一起来解锁VSCode的超神技能吧&#xff01; 开篇碎碎念 &#x1f3af; 第一次用VSCode时&#xff0c;就像个闯入魔法世…...

leetcode-21-合并两个有序链表

题解&#xff1a; 1、初始化哑节点dum 2、 3、 代码&#xff1a; 参考&#xff1a;leetcode-88-合并两个有序数组...

SSM项目部署到服务器

将SSM&#xff08;Spring Spring MVC MyBatis&#xff09;项目部署到服务器上&#xff0c;通常需要以下步骤&#xff1a; 打包项目 生成一个WAR文件&#xff0c;通常位于target目录下 配置Tomcat&#xff1a; 将生成的WAR文件复制到Tomcat的webapps目录下。 配置conf/se…...

【Linux】网络编程:初识协议,序列化与反序列化——基于json串实现,网络通信计算器中简单协议的实现、手写序列化与反序列化

目录 一、什么是协议&#xff1f; 二、为什么需要有协议呢&#xff1f; 三、协议的应用 四、序列化与反序列化的引入 什么是序列化和反序列化&#xff1f; 为什么需要序列化和反序列化&#xff1f; 五、序列化推荐格式之一&#xff1a;JSON介绍 六、网络版计算器编程逻…...

Educational Codeforces Round 171 (Rated for Div. 2)(A~D) 题解

Problem - A - Codeforces--PerpendicularSegments 思路:正方形对角线最长,并且相互垂直.直接输出即可. int x,y,k; void solve(){ //Acin>>x>>y>>k;int resmin(x,y);cout<<"0 0"<<" "<<res<<" &q…...

【教程】Git 标准工作流

目录 前言建仓&#xff0c;拉仓&#xff0c;关联仓库修改代码更新本地仓库&#xff0c;并解决冲突提交代码&#xff0c;合入代码其他常用 Git 工作流删除本地仓库和远程仓库中的文件日志打印commit 相关 前言 Git 是日常开发中常用的版本控制工具&#xff0c;配合代码托管仓库…...

Nico,从零开始干掉Appium,移动端自动化测试框架实现

开头先让我碎碎念一波~去年差不多时间发布了一篇《 UiAutomator Nico&#xff0c;一个基于纯 adb 命令实现的安卓自动化测试框》&#xff08;https://testerhome.com/topics/37042&#xff09;&#xff0c; 由于种种原因 (详见此篇帖子) 当时选择了用纯 adb 命令来实现安卓自动…...

PHP合成图片,生成海报图,poster-editor使用说明

之前写过一篇使用Grafika插件生成海报图的文章&#xff0c;但是当我再次使用时&#xff0c;却发生了错误&#xff0c;回看Grafika文档&#xff0c;发现很久没更新了&#xff0c;不兼容新版的GD&#xff0c;所以改用了intervention/image插件来生成海报图。 但是后来需要对海报…...

微信小程序 - 数组 push / unshift 追加后数组返回内容为数字(数组添加后打印结果为 Number 数值类型)

前言 假设一个空数组,通过 push 方法追加了一个项,控制台打印的结果竟然是 Number 数值。 例如,以下微信小程序代码: // 源数组 var arr = [] // 追加数据 var tem = arr.push(数据)...

1、DevEco Studio 鸿蒙仓颉应用创建

1. 仓颉鸿蒙应用简介 因为仓颉是静态编译型语言&#xff0c;使用仓颉开发的应用执行效率更高。而且主打全场景&#xff0c;后续可并入仓颉生态&#xff0c;其和ArkTS都是基于ArkUI进行开发&#xff0c;最大的区别是typescript和仓颉语法间的差异。 2. 应用创建 前置条件&…...

从头开始学PHP之面向对象

首先介绍下最近情况&#xff0c;因为最近入职了且通勤距离较远&#xff0c;导致精力不够了&#xff0c;而且我发现&#xff0c;人一旦上了班&#xff0c;下班之后就不想再进行任何脑力劳动了&#xff08;对大部分牛马来说&#xff0c;精英除外&#xff09;。 话不多说进入今天的…...

C++ | Leetcode C++题解之第519题随机翻转矩阵

题目&#xff1a; 题解&#xff1a; class Solution { public:Solution(int m, int n) {this->m m;this->n n;this->total m * n;srand(time(nullptr));}vector<int> flip() {int x rand() % total;vector<int> ans;total--; // 查找位置 x 对应的…...

vrrp和mstp区别

思路 vrrp是用来虚拟网关&#xff0c;噢&#xff0c;是虚拟一条虚拟网关 优先级&#xff0c;priority越大越优先&#xff0c;优先级相同&#xff0c;哪个的路由器的vrrp先起来&#xff0c;谁就是主 mstp是快速生成树协议&#xff0c;防止环路用的 优先级越小越优先 华为命令…...

前端页面整屏滚动fullpage.js简单使用

官网CSS,JS地址 fullPage.js/dist/fullpage.min.js at master alvarotrigo/fullPage.js GitHub fullPage.js/dist/fullpage.min.css at master alvarotrigo/fullPage.js GitHub <!DOCTYPE html> <html lang"en"><head><meta charset"…...

JQuery基本介绍和使用方法

JQuery基本介绍和使用方法 W3C 标准给我们提供了⼀系列的函数, 让我们可以操作: ⽹⻚内容⽹⻚结构⽹⻚样式 但是原⽣的JavaScript提供的API操作DOM元素时, 代码⽐较繁琐, 冗⻓. 我们可以使⽤JQuery来操作⻚⾯对象. jQuery是⼀个快速、简洁且功能丰富的JavaScript框架, 于20…...

【案例】旗帜飘动

开发平台&#xff1a;Unity 6.0 开发工具&#xff1a;Shader Graph 参考视频&#xff1a;Unity Shader Graph 旗帜飘动特效   一、效果图 二、Shader Graph 路线图 三、案例分析 核心思路&#xff1a;顶点偏移计算 与 顶点偏移忽略 3.1 纹理偏移 视觉上让旗帜保持动态飘动&a…...

大模型思维链推理的综述:进展、前沿和未来

转自公众号AIRoobt A Survey of Chain of Thought Reasoning: Advances, Frontiers and Future 思维链推理的综述&#xff1a;进展、前沿和未来 摘要&#xff1a;思维链推理&#xff0c;作为人类智能的基本认知过程&#xff0c;在人工智能和自然语言处理领域引起了极大的关注…...

项目一:使用 Spring + SpringMVC + Mybatis + lombok 实现网络五子棋

一&#xff1a;系统展示: 二&#xff1a;约定前后端接口 2.1 登陆 登陆请求&#xff1a; GET /login HTTP/1.1 Content-Type: application/x-www-form-urlencodedusernamezhangsan&password123登陆响应&#xff1a; 正常对象&#xff1a;正常对象会在数据库中存储&…...

openEuler 系统中 Samba 文件共享服务器管理(windows、linux文件共享操作方法)

一、Samba 简介 Samba 是在 Linux 和 Unix 系统上实现 SMB/CIFS 协议的一个免费软件&#xff0c;使得这些系统可以与 Windows 系统进行文件和打印机共享。通过 Samba&#xff0c;可以将 openEuler 系统配置为文件服务器&#xff0c;让 Windows、Linux 和其他支持 SMB/CIFS 协议…...

OpenClaw Windows 端快速部署教程 小白实操指南

OpenClaw 一键安装包&#xff5c;一键部署&#xff0c;轻松搞定环境配置 适配系统&#xff1a;Windows10/11 64 核心优势&#xff1a;全程可视化操作&#xff0c;无需命令行、无需手动配置 Python/Node.js&#xff0c;内置所有运行依赖&#xff0c;5 分钟即可完成部署&#x…...

模型逆向攻击(MIA)实战剖析:从原理到攻防演进

1. 模型逆向攻击&#xff08;MIA&#xff09;的本质与核心原理 第一次听说模型逆向攻击&#xff08;Model Inversion Attack&#xff09;时&#xff0c;我脑海中浮现的是黑客电影里那种对着键盘一通乱敲就能破解系统的场景。但真正深入研究后才发现&#xff0c;MIA更像是一种&q…...

AI提示词工程化:Git仓库管理、版本控制与团队协作实战

1. 项目概述&#xff1a;一个提示词仓库的诞生与价值最近在折腾AI应用开发时&#xff0c;我遇到了一个几乎所有开发者都会头疼的问题&#xff1a;如何高效地管理和复用那些精心调校过的提示词&#xff08;Prompt&#xff09;。无论是用于代码生成的、内容创作的&#xff0c;还是…...

告别卡顿!用这款神器轻松下载M3U8格式视频流

告别卡顿&#xff01;用这款神器轻松下载M3U8格式视频流 【免费下载链接】m3u8-downloader 一个M3U8 视频下载(M3U8 downloader)工具。跨平台: 提供windows、linux、mac三大平台可执行文件,方便直接使用。 项目地址: https://gitcode.com/gh_mirrors/m3u8d/m3u8-downloader …...

鸿蒙页面代码构建:基于 HarmonyOS 6.0 的跨端开发实战

鸿蒙页面代码构建&#xff1a;基于 HarmonyOS 6.0 的跨端开发实战 前言 随着移动互联网和物联网的深度融合&#xff0c;应用开发正在从单一平台走向跨端、多终端协作的时代。华为鸿蒙操作系统&#xff08;HarmonyOS&#xff09;自诞生以来&#xff0c;一直致力于为开发者提供统…...

C++定时器实战:从线程轮询到时间轮算法的演进与选型

1. 定时器技术选型的核心痛点 当我们需要在C项目中实现定时任务调度时&#xff0c;最直观的做法可能就是直接开个线程轮询了。我刚开始做网络服务开发时也这么干过&#xff0c;结果上线后CPU直接飙到90%——这就是典型的"新手陷阱"。实际上&#xff0c;定时器的实现方…...

(Python)Pandas reset_index() 实战解析:从数据混乱到索引清晰

1. 为什么你的Pandas数据总是乱糟糟&#xff1f; 每次处理完数据&#xff0c;看着那个乱七八糟的索引是不是特别头疼&#xff1f;我刚开始用Pandas的时候&#xff0c;经常遇到这样的问题&#xff1a;合并几个表格后索引重复了&#xff0c;分组统计后多出来一堆莫名其妙的层级&a…...

基于eNSP的园区网络高可用与安全隔离综合实验

1. 实验背景与核心价值 园区网络作为企业数字化转型的基础设施&#xff0c;其稳定性和安全性直接关系到日常运营效率。记得去年参与某金融机构网络改造项目时&#xff0c;他们的核心业务系统因为单点故障导致全网瘫痪4小时&#xff0c;直接损失超过百万。这个案例让我深刻认识到…...

STM32CubeMX实战:5分钟搞定MAX31865 PT100测温,从SPI配置到温度读取全流程

STM32CubeMX实战&#xff1a;5分钟搞定MAX31865 PT100测温&#xff0c;从SPI配置到温度读取全流程 在工业测温领域&#xff0c;PT100凭借其优异的线性度和稳定性成为温度测量的黄金标准。而MAX31865作为专为RTD传感器设计的信号调理器&#xff0c;极大简化了前端电路设计。本文…...

Node.js服务端应用无缝集成Taotoken提供多模型AI能力

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Node.js服务端应用无缝集成Taotoken提供多模型AI能力 将大模型能力集成到Node.js后端服务中&#xff0c;可以快速为应用增加智能对…...