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

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

class Solution {
public:vector<int> searchRange(vector<int>& nums, int target) {vector<int> res(2,-1);res[0]=findleft(nums,target);if(res[0] == -1) return res;res[1] = findright(nums,target);return res;}
private:int findleft(vector<int> &nums,int target){int left = 0,right = nums.size()-1, pos =-1;    while(left <= right){int mid = left + (right - left)/2;if(nums[mid] == target  ){//继续寻找左边相同的targetpos = mid;//存储最左边的相同值right =  mid-1;}else if(nums[mid] > target){right = mid-1;}else{left =mid+1;}}return pos;}int findright(vector<int> &nums,int target){int left = 0,right = nums.size()-1, pos =-1;    while(left <= right){int mid = left + (right - left)/2;if(nums[mid] == target  ){//继续寻找右边相同的targetpos = mid;//存储最右边的相同值left = mid +1;}else if(nums[mid] > target){right = mid-1;}else{left =mid+1;}}return pos;}};

在这道题中,分左右进行查找的核心原因是为了满足以下两个要求:

  1. 目标值在数组中的开始位置(最左边的位置)。
  2. 目标值在数组中的结束位置(最右边的位置)。

由于数组中可能存在多个相同的目标值 target,而普通的二分查找只能找到其中一个目标值,无法区分最左边还是最右边的位置。因此,我们必须 分两次二分查找 来解决这个问题。


为什么普通二分查找不够用?

假设数组为:

nums = {5, 7, 7, 8, 8, 10};
target = 8;

使用普通二分查找:

  • mid 可能落在第一个 8 处(索引 3),也可能落在第二个 8 处(索引 4)。
  • 二分查找的默认逻辑在找到目标值后不确定要向左还是向右继续查找,导致只找到某个 target 的位置。

而题目要求:

  • 最左位置:索引 3
  • 最右位置:索引 4

分两次查找的必要性

为了确保找到 target 在数组中的起始位置结束位置,必须使用以下两个独立的查找逻辑:

  1. 查找最左边的位置

    • 当找到 nums[mid] == target 时,不直接返回,而是继续向左查找(即 right = mid - 1)。
    • 这样可以保证最终找到 target 出现的第一个位置。
  2. 查找最右边的位置

    • 当找到 nums[mid] == target 时,不直接返回,而是继续向右查找(即 left = mid + 1)。
    • 这样可以保证最终找到 target 出现的最后一个位置。

分左右查找的实现原理

查找最左位置的过程:
  • nums[mid] == target
    • 记录当前位置 pos = mid(可能是最左的位置)。
    • 向左继续搜索,即更新 right = mid - 1
  • 最终返回记录的 pos
查找最右位置的过程:
  • nums[mid] == target
    • 记录当前位置 pos = mid(可能是最右的位置)。
    • 向右继续搜索,即更新 left = mid + 1
  • 最终返回记录的 pos

示例演示

假设 nums = {5, 7, 7, 8, 8, 10}target = 8

查找最左位置
  1. left = 0, right = 5, mid = 2nums[mid] = 7 < 8 → 更新 left = 3
  2. left = 3, right = 5, mid = 4nums[mid] = 8 → 更新 right = mid - 1 = 3
  3. left = 3, right = 3, mid = 3nums[mid] = 8 → 更新 right = mid - 1 = 2

最终,最左位置是 3


查找最右位置
  1. left = 0, right = 5, mid = 2nums[mid] = 7 < 8 → 更新 left = 3
  2. left = 3, right = 5, mid = 4nums[mid] = 8 → 更新 left = mid + 1 = 5
  3. left = 5, right = 5, mid = 5nums[mid] = 10 > 8 → 更新 right = mid - 1 = 4

最终,最右位置是 4


总结

  1. 为什么要分两次查找?

    • 普通二分查找只能定位到某个 target,无法保证找到最左或最右位置。
    • 分两次查找(向左、向右)可以准确找到开始和结束位置。
  2. 时间复杂度

    • 两次二分查找,每次都是 O(log⁡n)O(\log n),总时间复杂度仍然是 O(log⁡n)O(\log n)。
  3. 代码清晰度

    • 通过两次独立查找,逻辑更清晰、易于理解。

这样设计的代码能够高效解决问题,符合题目要求的时间复杂度 O(log⁡n)O(\log n)。

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

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

相关文章

#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍03-SQL注入联合查询注入(Union-Based SQL Injection)

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

你了解TCP/IP参考模型吗

前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 你了解TCP/IP参考模型吗 一. TCP/IP参考模型二. TCP/IP模型图解三. TCP/IP模型的对比与OSI模型四. TCP/IP协议族五. 总结 TCP/IP参考…

RK3588, FFmpeg 拉流 RTSP, mpp 硬解码转RGB

RK3588 ,基于FFmpeg, 拉取RTSP,使用 mpp 实现硬解码. ⚡️ 参考: Rk3588 FFmpeg 拉流 RTSP, 硬解码转RGBUbuntu x64 架构, 交叉编译aarch64 FFmpeg mppCode RTSPint open_stream(

MySQL八股-全局锁,表级锁,表锁,元数据锁,意向锁,行级锁,行锁,间隙锁,临键

文章目录 全局锁表级锁表锁(表级锁)元数据锁(MDL&#xff0c;Meta Data Lock&#xff0c;表级锁)元数据锁演示元数据锁兼容的情况元数据锁互相阻塞的情况 意向锁&#xff08;Intention lock&#xff0c;表级锁&#xff09;意向锁分类意向锁演示&#xff1a;意向共享锁(**IS**)与…

【BUG记录】Apifox 参数传入 + 号变成空格的 BUG

文章目录 1. 问题描述2. 原因2.1 编码2.2 解码 3. 解决方法 1. 问题描述 之前写了一个接口&#xff0c;用 Apifox 请求&#xff0c;参数传入一个 86 的电话&#xff0c;结果到服务器 就变成空格了。 Java 接收请求的接口&#xff1a; 2. 原因 2.1 编码 进行 URL 请求的…

51c视觉~合集31

我自己的原文哦~ https://blog.51cto.com/whaosoft/12088488 #PDD 西南交大&利兹大学等联合提出金字塔离散扩散模型&#xff08;PDD&#xff09;&#xff0c;实现了3D户外场景生成的粗到细的策略 本文是对 ECCV 2024 Oral 文章Pyramid Diffusion for Fine 3D Large S…

strace跟踪的原理以及使用

如果想成为一名合格的工程师&#xff0c;那肯定应该知道如何去分析应用逻辑&#xff0c;对于如何优化应用代码提升系统性能也应该能有自己的一套经验。而今天想要讨论的是&#xff0c;如何拓展自己的边界&#xff0c;让自己能够分析代码之外的模块&#xff0c;以及对我自己而言…

Canoe CAPL编程

文章目录 CAPL 简介CAPL的程序结构CAPL的数据类型1. 无符号整数2. 有符号整数3. 有符号整数4. CAN消息类型5. 定时器类型6. 变量定义 on message xxx 中 this相关方法公共方法1. output(msgName) 从程序块输出message&#xff08;形式1&#xff09;或errorframe&#xff08;形式…

详解CompletableFuture

最近一直畅游在RocketMQ的源码中&#xff0c;发现在RocketMQ中很多地方都使用到了CompletableFuture&#xff0c;所以今天就跟大家来聊一聊JDK1.8提供的异步神器CompletableFuture&#xff0c;并且最后会结合RocketMQ源码分析一下CompletableFuture的使用。 Future接口以及它的…

HarmonyOS 非线性容器LightWeightMap 常用的几个方法

LightWeightMap可用于存储具有关联关系的key-value键值对集合&#xff0c;存储元素中key值唯一&#xff0c;每个key对应一个value。 LightWeightMap依据泛型定义&#xff0c;采用轻量级结构&#xff0c;初始默认容量大小为8&#xff0c;每次扩容大小为原始容量的两倍。 集合中k…

三极管功能

1 三极管的结构 2 三极管开关电路设计注意事项 1 三极管进入饱和状态 电机&#xff1a;500毫安 2 判断三级什么状态&#xff1a;电压法 3 判断三级什么状态&#xff1a;电流法 4 求IB的电阻 5 当三极管用作开关时&#xff0c;通常N型三极管控制负载的gnd端&#xff0c;P型…

P6打卡—Pytorch实现人脸识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 1.检查GPU import torch import torch.nn as nn import matplotlib.pyplot as plt import torchvisiondevicetorch.device("cuda" if torch.cuda.is_…

R square 的计算方法和一点思考

模型的性能评价指标有几种方案&#xff1a;RMSE&#xff08;平方根误差&#xff09;、MAE&#xff08;平均绝对误差&#xff09;、MSE(平均平方误差)、R2_score 其中&#xff0c;当量纲不同时&#xff0c;RMSE、MAE、MSE难以衡量模型效果好坏。这就需要用到R2_score&#xff1…

解决并发情况下调用 Instruct-pix2pix 模型推理错误:index out of bounds 问题

解决并发情况下调用 Instruct-pix2pix 模型推理错误&#xff1a;index out of bounds 问题 背景介绍 在对 golang 开发的 图像生成网站 进行并发测试时&#xff0c;调用基于 Instruct-pix2pix 模型和 FastAPI 的图像生成 API 遇到了以下错误&#xff1a; Model inference er…

利用DFT画有限长序列的DTFT

MATLAB中没有DTFT函数&#xff0c;计算机不可能给出连续结果&#xff0c;可以只能利用DFT的fft函数来实现。 %% L 7; x ones(1, L) figure; tiledlayout(2,3,"TileSpacing","tight") nexttile; stem([0:L-1],x) box off title([num2str(L), points rect…

【进程篇】03.进程的概念与基本操作

一、进程的概念与理解 1.1 概念 进程是程序的一个执行实例&#xff0c;即正在执行的程序。 1.2 理解 我们编写代码运行后会在磁盘中会形成一个可执行程序&#xff0c;当我们运行这个可执行程序时&#xff0c;这个程序此时就会被操作系统的调度器加载到内存中&#xff1b;操…

基于MATLAB 的数字图像处理技术总结

大家好&#xff01;欢迎来到本次的总结性的一篇文章&#xff0c;因为咸鱼哥这几个月是真的有点小忙&#xff08;参加了点小比赛&#xff0c;准备考试等等&#xff09;所以&#xff0c;在数字图像学习后&#xff0c;我来写一个总结性的文章&#xff0c;同时帮助大家学习&#xf…

llama2——微调lora,第一次参考教程实践完成包括训练和模型

前言&#xff1a;磕磕绊绊&#xff0c;不过收获很多&#xff0c;最大的收获就是解决报错error的分析方法和解决思路 1、首先&#xff0c;我参考的是这篇博客&#xff1a;怎样训练一个自己的大语言模型&#xff1f;全网最简单易懂的教程&#xff01;_开源模型训练出一个语言模型…

类OCSP靶场-Kioptrix系列-Kioptrix Level 3

一、前情提要 二、实战打靶 1. 信息收集 1.1. 主机发现 1.2. 端口扫描 1.3.目录遍历 1.4. 敏感信息 2.漏洞发现 2.1.登录功能账号密码爆破 2.2.CMS历史漏洞 2.2.1.exp利用 2.2.2.提权 2.3. sql注入getshell 2.3.1.发现注入点 2.3.2. 测试字段和类型 2.3.3.查询字…

WPF实现曲线数据展示【案例:震动数据分析】

wpf实现曲线数据展示&#xff0c;函数曲线展示&#xff0c;实例&#xff1a;震动数据分析为例。 如上图所示&#xff0c;如果你想实现上图中的效果&#xff0c;请详细参考我的内容&#xff0c;创作不易&#xff0c;给个赞吧。 一共有两种方式来实现&#xff0c;一种是使用第三…